Link-локальная Многоадресная рассылка по QUdpSocket в Windows
Я пытаюсь отправить UDP-телеграмму с помощью link-local multicast. Я использую Qt, который предлагает QUdpSocket. Я смог сделать это на 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 link-локальные адреса в обеих операционных системах.
QUdpSocket::joinMulticastGroup()
ничего не сделал также (как и ожидалось, потому что это касается только получения).
Почему Windows отказывается отправлять телеграмму? В моем коде чего-то не хватает или в Qt есть ошибка? У кого-нибудь это получилось? Пожалуйста помочь.
1 ответ:
Второй подход был правильным. Я должен был
open()
сокеты снова послеclose()
ing их. Я думаю, что это было сделано в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); } }