QUdpSocket Multicastreceiver

时间:2016-08-18 09:27:05

标签: c++ qt sockets upnp

我在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个路由器,如果我运行Programm,套接字会从DrayTek路由器读取数据报并忽略来自FRITZ!Box的响应。 奇怪的是,如果我在调试模式下运行Programm,套接字会按照我的预期捕获两个响应。

这是Qt问题还是我错了? 感谢您阅读和任何建议。

0 个答案:

没有答案