gpt4 book ai didi

windows - Windows 上通过 QUdpSocket 的链路本地多播

转载 作者:可可西里 更新时间:2023-11-01 10:36:06 25 4
gpt4 key购买 nike

我正在尝试使用链路本地多播发送 UDP 报文。我正在使用提供 QUdpSocket 的 Qt。我能够在 Linux 上执行此操作,但无法让代码在 Windows 上运行。

我的第一个代码是这样的:

udp.writeDatagram(QByteArray("hello world"), QHostAddress("FF02::1"), 4321);

它适用于 Linux 但不适用于 Windows。我什至尝试以管理员权限运行该应用程序。 writeDatagram() 返回两个系统上电报的大小。

我找到的唯一建议是在特定网络接口(interface)上发送电报。我的这种方法代码:

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 中是否存在错误?有人让这个工作吗?请帮忙。

最佳答案

第二种方法是正确的。在 close() 之后,我不得不再次 open() 套接字。我想我认为这是在 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);
}

}

关于windows - Windows 上通过 QUdpSocket 的链路本地多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com