Windows上的QUdpSocket上的链路本地多播

时间:2014-09-05 23:57:28

标签: windows qt udp ipv6 multicast

我正在尝试使用链路本地多播发送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(在发送机器和网络中的另一台机器上)检查是否发送了电报。为了检查网络代码是否完全可行,我添加了一个可在Windows上使用这两种解决方案的IPv4广播。我知道我的Windows支持IPv6,因为它有一个链接本地地址。 Windows防火墙在测试期间被禁用,我在测试系统上没有安装其他防火墙。可以找到完整的测试代码here in a Gist

为什么Windows拒绝发送电报?我的代码遗漏了什么或Qt中有错误吗?有没有人让这个工作?请帮忙。

1 个答案:

答案 0 :(得分:1)

第二种方法是正确的。在open()之后我不得不再次close()个套接字。我想我认为这是在bind()中完成的,因为套接字在创建对象后打开了......

工作代码:

foreach(const QHostAddress& address, QNetworkInterface::allAddresses()) {
    if(address.protocol() == QAbstractSocket::IPv6Protocol) {
        _udp.bind(address, 0);
        _udp.writeDatagram(data, QHostAddress("FF02::1"), DISCO_PORT);

        _udp.close();
        _udp.open(QUdpSocket::ReadWrite);
    }

}