• 4016阅读
  • 5回复

难道我遇到了Qt的Bug? [复制链接]

上一主题 下一主题
离线fox123
 

只看楼主 正序阅读 楼主  发表于: 2018-05-05
— 本帖被 toby520 从 Qt代码秀 移动到本区(2018-08-31) —
本人在做QUpSocket的网络通信程序。代码如下:

int MainWindow::initSocket(quint16 localPort)
{
    if(udpSocket!=0){
        udpSocket->abort();
        delete udpSocket;
        udpSocket = 0;
    }
    udpSocket = new QUdpSocket(this);
    bool ret = udpSocket->bind(QHostAddress::AnyIPv4, localPort);
    if(!ret){
        QMessageBox::warning(this, "警告", QString("创建Socket失败!:%1").arg(udpSocket->errorString()));
        return -1;
    }
    connect(udpSocket, &QUdpSocket::readyRead, this , &MainWindow::readPendingDatagrams);
    return 0;
}
void MainWindow::readPendingDatagrams()
{
    qDebug()<<udpSocket->hasPendingDatagrams();
    while(udpSocket->hasPendingDatagrams())
    {
        QByteArray frame;
        frame.resize(udpSocket->pendingDatagramSize());
        QHostAddress address;
        quint16 port;


        udpSocket->readDatagram(frame.data(), frame.size(), &address, &port);
       processTheDatagrams(frame);
}
开始时上位机给下位机发送01 10 ff的指令,收到下位机返回数据后发送后面的指令。
以下是Log日志:

[10:03:38.442 Send : 10.12.9.108 8081] 01 10 ff
[10:03:38.474 Recv : 10.12.9.108 8081] 01 10 ff
[10:03:41.479 Send : 10.12.9.108 8081] 01 17 00
[10:03:41.485 Recv : 10.12.9.108 8081] 01 17
[10:03:41.490 Send : 10.12.9.108 8081] 01 11 00 55 00 01
[10:03:44.497 Send : 10.12.9.108 8081] 01 11 00 55 00 01
开始时收发指令正常,到发送01 11这条指令的时候,就收不到下位机返回的数据了,不知道是为何?
qDebug()<<udpSocket->hasPendingDatagrams();打印的状态有两个,一次是true, 一次是false,false的时候我就没法处理数据然后发送后续的指令了。
用Wireshark抓包软件,抓包也能看到下位机确实给我回传了响应01 11指令的数据。为何上位机接收不到呢?

难道是QUdpSocket的Bug????  
本人使用的Qt版本是Qt5.7.0 mingw版的。这个版本也用了有一年多了,之前也是相同的处理代码,没有遇到类似问题啊。最近碰到了,不知道怎么回事。大家有遇到过吗???


离线yanwuyue

只看该作者 5楼 发表于: 2018-05-24
我是这么打开UDP的

udp->bind(QHostAddress::Any, port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);

这行要注释掉,否则已经执行了一次了
qDebug()<<udpSocket->hasPendingDatagrams();
离线yuyu414

只看该作者 4楼 发表于: 2018-05-07
void MainWindow::readPendingDatagrams()
{
    qDebug()<<udpSocket->readAll().toHex();
}
离线fox123

只看该作者 3楼 发表于: 2018-05-05
回 fox123 的帖子
fox123:感谢刘大神回复!我试了移到while外边也不行。
不过把while循环改成do while循环,数据收发确能正常进行。
....... (2018-05-05 13:58) 

返回false的时候frame.size=0, address.toString=""

true
3 "10.12.9.108"
2 "10.12.9.108"
false
0 ""
false
0 ""
false
0 ""
true
6 "10.12.9.108"
true
6 "10.12.9.108"
true
6 "10.12.9.108"
true
6 "10.12.9.108"
true
6 "10.12.9.108"
离线fox123

只看该作者 2楼 发表于: 2018-05-05
回 liudianwu 的帖子
liudianwu:如果qt封装的socket连这么几个字节的数据收发都搞不定有问题,那还要qt有啥用![表情]
你可以把
QByteArray frame;      
QHostAddress address;
quint16 port;
....... (2018-05-05 11:58) 

感谢刘大神回复!我试了移到while外边也不行。

不过把while循环改成do while循环,数据收发确能正常进行。

qDebug()<<udpSocket->hasPendingDatagrams();打印的状态,有一个true, 三个false,然后后边的都是True。很奇怪啊。

不知道readyRead信号什么时候触发,hasPendingDatagrams()什么时候返回false。
离线liudianwu

只看该作者 1楼 发表于: 2018-05-05
如果qt封装的socket连这么几个字节的数据收发都搞不定有问题,那还要qt有啥用!
你可以把
QByteArray frame;      
QHostAddress address;
quint16 port;
移到while外层试试!
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个