使用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是非阻塞的:只有在hasPendingDatagrams()为true时,您才可以有用地调用它。反过来,通过运行Qt事件循环来控制此标志。

您有两个选择:

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