首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取网络. Colasoft包播放器用Qt发送的数据

读取网络. Colasoft包播放器用Qt发送的数据
EN

Stack Overflow用户
提问于 2015-09-24 08:19:24
回答 1查看 598关注 0票数 0

我正在尝试读取由Colasoft包播放器通过Qt发送的数据。

我使用了一个带有IP 192.168.1.99的环回适配器,Wireshark向我展示了如下内容:

SourceIP: 192.168.1.1

SourcePort: 40102

DestinationIP: 224.0.1.12

DestinationPort: 49156

但是使用这些IP和端口,Qt QUdpSocket不显示任何数据。当我试图读取所有的端口和IP,我收到数据,所以程序应该可以工作,但似乎,我没有收到任何数据由Colasoft数据包播放器。

我做错什么了?

谢谢!

代码语言:javascript
复制
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() << "\n+-------------------------------";
        qDebug() << "|Message from:" << sender.toString(); 
        qDebug() << "|Message port:" << senderPort;
        qDebug() << "|Message:" << buffer;
        qDebug() << "+-------------------------------\n";
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-24 10:26:40

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

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

还有Qt 多播接收实例

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

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

现在,使用joinMulticastGroup()和替换QHostAddress::Any -> QHostAddress::AnyIPv4,代码可以接收来自VLC播放器的多播流。

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

  • 路由设置
  • Colasoft包播放器包装错误
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32756605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档