Использование QUdpSocket для отправки дейтаграмм - PullRequest
3 голосов
/ 16 июня 2011

Я пытаюсь отправить дейтаграмму с помощью QUdpSocket. Вот код, который я использую:

udpSocket = new QUdpSocket(this);
QByteArray datagram = "Message";
udpSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45454);

Теперь, если я запускаю это на компьютере, который имеет только один сетевой адаптер, он, кажется, работает без проблем. Однако, если есть несколько адаптеров, мне нужно иметь возможность контролировать, какой из них используется для отправки дейтаграммы. Я обнаружил, что если я свяжу сокет следующим образом:

udpSocket->bind(QHostAddress("192.168.1.104"), 45454);

тогда я могу принудительно отправить дейтаграмму в локальной сети, связанной с этим IP-адресом (в противном случае он выбирается случайным образом). Тем не менее, функция 'bind' устанавливает сокет для прослушивания пакетов, что на самом деле меня не интересует в данный момент. Это правильный способ контролировать, какой адаптер используется, или есть более простой способ сделать это?

Спасибо

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

Вам нужно что-то вроде этого

QHostAddress myBroadcastAddress = QHostAddress("192.168.255.255");
udpSocket->writeDatagram(datagram.data(),datagram.size(), myBroadcastAddress , 45454 )

Это отправит широковещательные пакеты udp.

2 голосов
/ 03 августа 2011

Широковещательный адрес подсети всегда является самым высоким адресом в подсети.В вашем случае:

адаптер1: адрес 192.168.1.104 маска подсети 255.255.255.0 широковещательная рассылка: 192.168.1.255

адаптер 2: адрес 192.168.56.1 маска подсети 255.255.255.0 широковещательная рассылка: 192.168.56.255

Таким образом, вам нужен как адрес адаптера, на котором вы хотите транслировать, так и маска подсети, чтобы найти правильный широковещательный адрес.

Если вы используете адрес адаптера и маску подсети для вычисления широковещательного адреса, это должноработа для сетей IPv4.

...