我正在尝试通过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()
在设定的时间(30s(内阻止您的程序 - 或者将上面的代码放在连接到
readyRead
信号的插槽处理程序中,让事件循环自然运行,使应用程序对其他输入保持响应