Qt 5.10.0(MSVC2015,32位)下QUdpSocket无法获取发送方IP地址
解决Qt UDP接收时无法获取发送方IP的问题
我之前调试Qt UDP通信时也碰到过一模一样的问题,大概率是你调用readDatagram的方式有误,咱们一步步来修正:
核心问题:readDatagram参数传递错误
Qt的QUdpSocket::readDatagram需要通过指针来接收发送方的IP和端口,如果你直接传变量值(而非地址),函数没办法把获取到的信息写回给你。从你给出的代码片段来看,应该是这里出了问题。
修正后的完整代码示例
把你的processPendingDatagrams()函数改成这样:
void Receiver::processPendingDatagrams() { QByteArray datagram; QHostAddress senderIP; quint16 senderPort = 0; while (udpSocket.hasPendingDatagrams()) { // 先调整数据报大小为待接收的长度 datagram.resize(udpSocket.pendingDatagramSize()); // 关键:传递senderIP和senderPort的指针(&符号) qint64 bytesRead = udpSocket.readDatagram( datagram.data(), datagram.size(), &senderIP, &senderPort ); if (bytesRead != -1) { // 现在就能正确拿到发送方的IP和端口了 qDebug() << "收到来自" << senderIP.toString() << "的消息,端口:" << senderPort; qDebug() << "消息内容:" << datagram; } else { qDebug() << "读取数据报失败:" << udpSocket.errorString(); } } }
额外排查要点
如果改完还是不行,再检查这几个地方:
- 套接字绑定是否正确:确保UDP套接字绑定到
QHostAddress::Any(允许接收来自任何IP的消息)和正确端口,比如:// 初始化时绑定端口,12345要和发送方一致 if (!udpSocket.bind(QHostAddress::Any, 12345)) { qDebug() << "绑定失败:" << udpSocket.errorString(); } - 组播配置(如果用组播):如果是组播通信,别忘了加入对应的组播组:
udpSocket.joinMulticastGroup(QHostAddress("224.0.0.1")); // 替换成你的组播地址 - 发送方目标地址:确认发送方是把消息发到了你的静态IP(192.168.0.106)或者组播地址,而非错误地址。
这样调整后,应该就能正常获取发送方的IP地址了。
内容的提问来源于stack exchange,提问作者Chen
相关产品推荐
相关产品推荐

