You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:50:19