【问题标题】:Receive data from specific address using QUdpSocket使用 QUdpSocket 从特定地址接收数据
【发布时间】:2021-01-20 08:57:27
【问题描述】:

我正在尝试通过 UDP 进行客户端到客户端的通信。我正在使用QUdpSocket 来做到这一点。

我的第一个客户端的 IP 是 127.0.0.2,第二个客户端的 IP 是 127.0.0.3。

在我的第一个客户端中,我想发送数据,所以我这样做:

socket = new QUdpSocket(this);
socket->bind(QHostAddress("127.0.0.2"), (quint16)actual_port);

...

Data = QByteArray::fromRawData((const char *)stockR.data, crypt_packet.size_struct); 
socket->writeDatagram(Data, QHostAddress("127.0.0.3"), (quint16)port_other);

在我的第二个客户中,我有这个:

socket = new QUdpSocket(this);
socket->bind(QHostAddress("127.0.0.3"), (quint16)port_second);
     
...

QByteArray buffer;
buffer.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);

但我无法从readDatagram() 收到我的数据,我不知道为什么。

我在双方都做每一个功能,这意味着我在两个客户端上读写(这是为了进行 VoIP 呼叫)。

有人知道我的错误是什么吗?

【问题讨论】:

  • 最后一个块是怎么调用的?是响应readyRead 信号吗? socket->hasPendingDatagrams() 是真的吗?
  • 我不使用 socket->hasPendingDatagrams 和 readyRead 也没有。

标签: c++ qt sockets qtnetwork qudpsocket


【解决方案1】:

readDatagram 方法是非阻塞的:只有当hasPendingDatagrams() 为真时,您才能有效地调用它。这个标志又由运行 Qt 事件循环来控制。

你有两个选择:

  • 使用socket->waitForReadyRead() 在设定的时间(30 秒)内阻止您的程序;
  • 或者将上述代码放入连接到readyRead 信号的槽处理程序中,让事件循环自然运行,让您的应用程序对其他输入保持响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 2021-04-16
    • 1970-01-01
    • 2010-09-21
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多