0

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

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

4

1 回答 1

2

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

你有两个选择:

  • 用于socket->waitForReadyRead()在设定的时间(30 秒)内阻止您的程序;
  • 或者将上面的代码放在连接到readyRead信号的槽处理程序中,让事件循环自然运行,让您的应用程序响应其他输入。
于 2020-10-05T14:00:24.623 回答