Я пишу Программу на Qt, которая должна обнаруживать Маршрутизаторы в локальной сети через UPnP.
Это конструктор моего класса:
Discovery::Discovery(QObject *parent):QObject(parent)
{
groupAddress = QHostAddress("239.255.255.250");
ssdpPort = 1900;
socket = new QUdpSocket(this);
socket->joinMulticastGroup(groupAddress);
connect(socket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
discovered = new QList<DiscoveryMatch>();
}
После создания я отправляю поисковое сообщение:
void Discovery::discover()
{
QByteArray Data;
Data.append("M-SEARCH * HTTP/1.1\r\n");
Data.append("HOST: 239.255.255.250:1900\r\n");
Data.append("ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n");
Data.append("MAN: \"ssdp:discover\"\r\n");
Data.append("MX: 5\r\n\r\n");
socket->writeDatagram(Data, groupAddress, ssdpPort);
}
Если устройство ответило, я обрабатываю ответ сигналом readyRead ():
void Discovery::processPendingDatagrams()
{
QByteArray buffer;
QHostAddress sender;
quint16 senderPort;
while(socket->hasPendingDatagrams())
{
buffer.resize(socket->pendingDatagramSize());
socket->readDatagram(buffer.data(), buffer.size(),&sender, &senderPort);
qDebug() << "Message from: " << sender.toString();
qDebug() << "Message port: " << senderPort;
qDebug() << "Message " << buffer;
processDatagram(buffer);
}
}
У меня есть 2 маршрутизатора в моей сети, и если я запускаю Программу, сокет считывает датаграмму с моего маршрутизатора DrayTek и игнорирует ответ от моего FRITZ! Box.
Странно то, что если я запускаю Программу в режиме отладки, сокет отлавливает оба ответа, как я и предполагал.
Это проблема Qt или я что-то не так?
Спасибо за чтение и за любые советы.
Задача ещё не решена.
Других решений пока нет …