• 1563阅读
  • 4回复

QT UDPSock 发射接收消息信号 [复制链接]

上一主题 下一主题
离线zxallen
 

只看楼主 倒序阅读 楼主  发表于: 2020-09-18
— 本帖被 toby520 从 网站公告 移动到本区(2020-09-20) —
各位大佬们好,本人QT小白一枚
最近学QT socket的时候发现了一个奇异的现象,大致情况如下:
构造函数中创建了一个udp套接字,该套接字绑定了本机的ip(本机ip即为“192.168.18.125”,端口为14551),如下所示;
udpSock = new QUdpSocket(this);    
udpSock->bind(QHostAddress("192.168.18.125"), 14551);    
heartTimer = new QTimer(this);    
heartTimer->setInterval(100);  
heartTimer->start();    
connect(udpSock, SIGNAL(readyRead()), this, SLOT(receive()));    connect(heartTimer, SIGNAL(timeout()), this, SLOT(sendDatagram()));

并且让该套接字定时发送消息给本机ip的另一个端口(即192.168.18.125:15551),如下所示;
void Widget::sendDatagram(){    
        QByteArray ba;    
        ba.resize(5);    
       ba[0] = 0x3c;    
       ba[1] = 0xb8;    
       ba[2] = 0x64;    
       ba[3] = 0x18;    
       ba[4] = 0xca;    
       udpSock->writeDatagram(ba, QHostAddress("192.168.18.125"), 15551);
}

但是发现套接字虽然并没有给 192.168.18.125(本机ip):14551 发送数据,但是这个套接字却一直发射readyRead()信号,如下所示;
void Widget::receive(){  
       QByteArray ba;    
       while(udpSock->hasPendingDatagrams())    
       {        
              ba.resize(udpSock->pendingDatagramSize());        
              udpSock->readDatagram(ba.data(), ba.size());        
              qDebug()<<"udpSock->hasPendingDatagrams()"<<ba.data()<<endl;  //会一直运行这段代码    
       }
}

但是如果我开一个网络调试助手接收192.168.18.125:15551的数据,这个套接字就不发射readyRead()信号;
这个问题困惑了我很久,希望大佬可以指点迷津~

一个人的高贵之处在于,无论多么的贫贱卑微,只要愿意学习并付出努力,便可以实现蜕变,可以自傲地立足于这个世界上。
在线liulin188

只看该作者 1楼 发表于: 2020-09-20
  
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线hp_201111

只看该作者 2楼 发表于: 2020-09-21
udpSock->writeDatagram(ba, QHostAddress("192.168.18.125"), 15551);
改成这样如何?
udpSock->writeDatagram(ba, QHostAddress("127.0.0.1"), 15551);
离线zxallen

只看该作者 3楼 发表于: 2020-09-21
回 liulin188 的帖子
liulin188:[表情]  [表情]  (2020-09-20 20:24) 

恕我愚昧 我不太理解您的意思
一个人的高贵之处在于,无论多么的贫贱卑微,只要愿意学习并付出努力,便可以实现蜕变,可以自傲地立足于这个世界上。
离线zxallen

只看该作者 4楼 发表于: 2020-09-21
回 hp_201111 的帖子
hp_201111:udpSock->writeDatagram(ba, QHostAddress("192.168.18.125"), 15551);
改成这样如何?
udpSock->writeDatagram(ba, QHostAddress("127.0.0.1"), 15551); (2020-09-21 15:05) 

我想问的是为什么发到本机ip的话会触发readyRead()信号?
一个人的高贵之处在于,无论多么的贫贱卑微,只要愿意学习并付出努力,便可以实现蜕变,可以自傲地立足于这个世界上。
快速回复
限100 字节
 
上一个 下一个