Есть задача: заслать пакет броадкастом и получить ответы на тот же порт, с которого посылали.
Тестовая программа:
#include <iostream>
#include <QUdpSocket>
#include <QHostAddress>
#include <QFile>
#include <QByteArray>
#include <QCoreApplication>
#include <QTextStream>
int main(int argc, char **argv)
{
if(argc != 2)
{
std::cerr << "usage: " << argv[0] << " <ip>\n";
return 1;
}
QCoreApplication app(argc, argv);
QFile log("net_test.log");
QTextStream logIO(&log);
log.open(QIODevice::WriteOnly);
logIO << "------------ Net Test ------------\n";
QHostAddress remoteHost(argv[1]);
QUdpSocket udpSocket;
udpSocket.bind(31317);
QByteArray toSend("\xFF\xFF\xFF\xFFinfostring\x00");
udpSocket.writeDatagram(toSend.data(), toSend.size(), remoteHost, 27015);
QByteArray toRecv;
while(udpSocket.waitForReadyRead(2000))
{
logIO << "\n\nReadyRead() == true\n\n";
while(udpSocket.hasPendingDatagrams())
{
logIO << "\n\nhasPendingDatagrams() == true\n\n";
toRecv.resize(udpSocket.pendingDatagramSize());
udpSocket.readDatagram(toRecv.data(), toRecv.size());
logIO << "toRecv: "<< toRecv;
}
logIO << "\n\nafter while2\n\n";
}
log.close();
return 0;
}
допустим в сети есть 1 машина, которая должна отвлекатся.
если ип задать как первые.три.октета.255 то результат такой:
------------ Net Test ------------
ReadyRead() == true
hasPendingDatagrams() == true
toRecv: <полученные байты>
hasPendingDatagrams() == true
toRecv: <_опять_ полученные байты>
after while2
а если же ип задать как 255.255.255.255, то получаем ожидаемый результат:
------------ Net Test ------------
ReadyRead() == true
hasPendingDatagrams() == true
toRecv: <полученные байты>
after while2
Почему hasPendingDatagrams() в первом случае отрабатывает 2 раза ?