【发布时间】:2014-10-30 23:24:33
【问题描述】:
我正在尝试使用链路本地多播发送 UDP 电报。我正在使用提供 QUdpSocket 的 Qt。我能够在 Linux 上执行此操作,但无法让代码在 Windows 上运行。
我的第一个代码如下所示:
udp.writeDatagram(QByteArray("hello world"), QHostAddress("FF02::1"), 4321);
它适用于 Linux,但不适用于 Windows。我什至尝试以管理员权限运行该应用程序。 writeDatagram() 返回两个系统上电报的大小。
我发现的唯一建议是在特定网络接口上发送电报。我对这种方法的代码:
foreach(const QHostAddress& address, QNetworkInterface::allAddresses()) {
udp.bind(address, 0);
if(address.protocol() == QAbstractSocket::IPv6Protocol) {
udp.writeDatagram(data, QHostAddress("FF02::1"), 4321);
}
udp.close();
}
代码再次在 Linux 上发送电报,但不在 Windows 上。 allAddresses() 在两个操作系统上返回 IPv6 链接本地地址。
QUdpSocket::joinMulticastGroup() 也没有做任何事情(正如预期的那样,因为它只涉及接收)。
我使用 Wireshark(在发送机器和网络中的另一台机器上)检查电报是否已发送。为了检查网络代码是否有效,我添加了一个 IPv4 广播,它可以在 Windows 上使用两种解决方案。我知道我的 Windows 支持 IPv6,因为它有一个本地链接地址。 Windows 防火墙在测试期间被禁用,我没有在测试系统上安装其他防火墙。完整的测试代码可以在here in a Gist找到。
为什么 Windows 拒绝发送电报?我的代码是否缺少某些内容或 Qt 中是否存在错误?有没有人让这个工作?请帮忙。
【问题讨论】:
标签: windows qt udp ipv6 multicast