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

Qt writeDatagram发送至指定IP返回-1问题求助

问题描述

我需要从Linux系统PC(IP:10.100.40.99)向另一设备(IP:10.100.40.62,端口7070)发送8字节数据,编写的代码如下:

udpPacket_t udpPacket;
udpPacket.byte0 = 0x00;
udpPacket.byte1 = 0x00;
udpPacket.byte2 = 0x00;
udpPacket.byte3 = 0x00;
udpPacket.byte4 = 0x00;
udpPacket.byte5 = 0x00;
udpPacket.byte6 = 0x00;
udpPacket.byte7 = 0x00;

QByteArray data;
data.append(udpPacket.byte0);
data.append(udpPacket.byte1);
data.append(udpPacket.byte2);
data.append(udpPacket.byte3);
data.append(udpPacket.byte4);
data.append(udpPacket.byte5);
data.append(udpPacket.byte6);
data.append(udpPacket.byte7);

int ret = socket->writeDatagram(data, QHostAddress("10.100.40.62"), 7070);

调用writeDatagram函数返回-1,但向广播地址10.100.40.255发送数据时成功。请问我遗漏了什么?

排查与解决要点
  • 确认目标设备的端口监听状态:在目标设备上执行netstat -ulnp | grep 7070(Linux环境),验证7070端口是否正在监听UDP数据包。如果目标端口未处于监听状态,单播发送必然失败;而广播发送成功只是发送端无报错,不代表有设备实际接收。
  • 检查网络连通性:在Linux PC上用ping 10.100.40.62确认双向网络可达,再用traceroute -U -p 7070 10.100.40.62排查UDP数据包的传输路径是否存在阻塞。
  • 核查Socket配置:
    • 若Socket开启了广播模式(调用过setSocketOption(QAbstractSocket::BroadcastOption, true)),部分Linux系统会限制该Socket的单播发送能力,可尝试关闭广播模式后重试。
    • 确认Socket绑定的地址是0.0.0.0(全接口)或本地IP10.100.40.99,避免绑定到仅支持广播的特殊接口。
  • 获取具体错误信息:writeDatagram返回-1后,立即调用socket->error()和socket->errorString(),这能直接定位错误原因,比如端口不可达、权限不足、网络接口异常等。
  • 检查防火墙规则:
    • 本地Linux PC端:查看iptables/ufw是否禁止了向10.100.40.62:7070的UDP输出流量。
    • 目标设备端:确认其防火墙是否允许7070端口的UDP输入流量。
  • 代码简化优化:你当前逐个字节拼接QByteArray的方式可以简化,直接通过结构体指针转换生成数据,避免手动拼接的繁琐和潜在错误:
    QByteArray data(reinterpret_cast<const char*>(&udpPacket), sizeof(udpPacket));
    

内容的提问来源于stack exchange,提问作者Cevdet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:15:47