读取Colaso ft Packet Player用Qt发送的网络数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读取Colaso ft Packet Player用Qt发送的网络数据相关的知识,希望对你有一定的参考价值。

我试图通过Qt读取Colaso​​ft Packet Player发送的数据。

我使用了一个IP为192.168.1.99的loopbackadapter,Wireshark给我看了这样的东西:

SourceIP:192.168.1.1

SourcePort:40102

DestinationIP:224.0.1.12

DestinationPort:49156

但是使用这些IP和端口,Qt QUdpSocket不会显示任何数据。当我尝试读取所有接收数据的端口和IP时,程序应该可以工作,但看起来,我没有得到Colaso​​ft Packet Player发送的任何数据。

我做错了什么?

谢谢!

MyUDPSocket::MyUDPSocket(QObject *parent)
: QObject(parent)
{
    socket = new QUdpSocket(this);


    //socket->bind(QHostAddress("127.0.0.1"), 40102);
    //socket->bind(QHostAddress("127.0.0.1"), 49156);

    //socket->bind(QHostAddress("224.0.1.12"), 40102);
    //socket->bind(QHostAddress("224.0.1.12"), 49156);

    //socket->bind(QHostAddress("192.168.1.1"), 40102);
    //socket->bind(QHostAddress("192.168.1.1"), 49156);

    //socket->bind(QHostAddress("192.168.1.99"), 40102);
    //socket->bind(QHostAddress("192.168.1.99"), 49156);


    //socket->bind(QHostAddress::Any, 40102);
    //socket->bind(QHostAddress::Any, 49156);

    socket->bind(QHostAddress::Any, 49156, QUdpSocket::ShareAddress);   
    socket->joinMulticastGroup(QHostAddress("224.0.1.12"));
    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}

void MyUDPSocket::readyRead()
{
        // when data comes in
        QByteArray buffer;
        buffer.resize(socket->pendingDatagramSize());

        QHostAddress sender;
        quint16 senderPort;

        // qint64 QUdpSocket::readDatagram(char * data, qint64 maxSize, 
        //                 QHostAddress * address = 0, quint16 * port = 0)
        // Receives a datagram no larger than maxSize bytes and stores it in data. 
        // The sender's host address and port is stored in *address and *port 
        // (unless the pointers are 0).

        socket->readDatagram(buffer.data(), buffer.size(),
                             &sender, &senderPort);
        qDebug() << "
+-------------------------------";
        qDebug() << "|Message from:" << sender.toString(); 
        qDebug() << "|Message port:" << senderPort;
        qDebug() << "|Message:" << buffer;
        qDebug() << "+-------------------------------
";
    }
}
答案

地址224.0.1.12对应于多播。因此,您想要加入多播流,请参阅该文档中的bool QUdpSocket::joinMulticastGroup(const QHostAddress & groupAddress)

请注意,如果您尝试加入IPv4组,则不得使用IPv6绑定套接字(或使用QHostAddress :: Any以双模式绑定)。您必须使用QHostAddress :: AnyIPv4。

还有Qt Multicast Receiver Example


由于原始问题代码更改而更新

我验证了编辑之前的原始代码(没有joinMulticastGroup())能够接收到端口49156的正常单播UDP数据包。因此,代码用作服务器侦听绑定端口。

现在使用joinMulticastGroup()和替换QHostAddress::Any - > QHostAddress::AnyIPv4,代码能够从VLC播放器接收多播流。

因此,编码问题得到了解决。其他可能的问题:

  • 路由设置
  • 由Colaso​​ft Packet Player错误地组成

以上是关于读取Colaso ft Packet Player用Qt发送的网络数据的主要内容,如果未能解决你的问题,请参考以下文章

zookeeper源码之客户端网络通信模块

libpcap 读取数据包大小

在 python 中写入、读取和排序列表列表

suricata抓包方式之一 AF_PACKET

navicat 导入数据报错 --- 1153 - got a packet bigger than 'max_allowed_packet' bytes

从逗号分隔的文件中读取到对象的向量