使用 QUdpSocket 从特定地址接收数据

Receive data from specific address using QUdpSocket

我正在尝试通过 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 呼叫)。

有谁知道我的错误是什么?

readDatagram 方法是 non-blocking:只有在 hasPendingDatagrams() 为真时才能调用它。该标志又由 运行 宁 Qt 事件循环控制。

您有两个选择:

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