找回密码
 立即注册
收起左侧

多线程TCP通信readyRead问题

4
回复
9616
查看
[复制链接]

尚未签到

来源: 2018-3-27 21:07:12 显示全部楼层 |阅读模式
1Qter豆
void TcpServer::run()//4.建立socket连接
{
    socket = new QTcpSocket;
    qDebug("run----------");
    //将Server传来的socketDescriptor与刚创建的socket关联
    if (!socket->setSocketDescriptor(socketDescriptor))
    {
        qDebug("socket error");
        return ;
    }
    bool b=connect(socket, SIGNAL(readyRead()),
            this, SLOT(TcpServerReceiveDataSlot()),
            Qt:irectConnection);// Qt::BlockingQueuedConnection
    qDebug("%d",b);
}

void TcpServer::TcpServerReceiveDataSlot()
{
    QString addr;
    QByteArray data;
    qDebug("TcpServerReceiveDataSlot------");
    if(!socket->atEnd())
    {
        data = socket->readAll();
    }
    emit TcpServerReceiveDataSignal(addr, data);
    emit finished();
}
b返回时true,但是不能收到数据。

回复

使用道具 举报

尚未签到

2018-3-29 23:41:52 显示全部楼层
遇到过类似情况,请参考。win7+Qt5.5,遇到readyread信号不可靠,表现为UDP断流,端口有数据但是没有触发readyread信号。通过定时器刷新槽函数,才能够正常读取数据。故障原因未知。具体到你的问题,b返回true只代表信号槽连接成功,不表示端口有数据,也不表示readyread信号发出来了。qDebug一下吧。

点评

顺便问一下楼主,你的这个现象有没有好的解决办法,因为我也碰到了,除了定时在去刷一次(这时候刷也真的不一定有数据,但那数据的确应该已经过来了,因为下一次触发的就是两次数据的粘包了)  详情 回复 发表于 2018-4-2 17:06
补充一点,你的槽和socket对象本身不在一个线程中,也是收不到的吧。  详情 回复 发表于 2018-4-2 17:05
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2018-4-2 17:05:16 显示全部楼层
zhanggaox03 发表于 2018-3-29 23:41
遇到过类似情况,请参考。win7+Qt5.5,遇到readyread信号不可靠,表现为UDP断流,端口有数据但是没有触发re ...

补充一点,你的槽和socket对象本身不在一个线程中,也是收不到的吧。
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2018-4-2 17:06:50 显示全部楼层
zhanggaox03 发表于 2018-3-29 23:41
遇到过类似情况,请参考。win7+Qt5.5,遇到readyread信号不可靠,表现为UDP断流,端口有数据但是没有触发re ...

顺便问一下楼主,你的这个现象有没有好的解决办法,因为我也碰到了,除了定时在去刷一次(这时候刷也真的不一定有数据,但那数据的确应该已经过来了,因为下一次触发的就是两次数据的粘包了)
回复

使用道具 举报

尚未签到

2018-4-9 00:20:32 显示全部楼层
dearcc 发表于 2018-4-2 17:06
顺便问一下楼主,你的这个现象有没有好的解决办法,因为我也碰到了,除了定时在去刷一次(这时候刷也真的 ...

说来好笑,解决办法是重装Win7。我的故障现象是在运行了一次上网痕迹清理工具后出现的,但我始终没查到修改了什么配置导致该问题软件在其它机器上运行正常,于是重装系统,解决。。。
粘包是肯定的,数据本身已经到了,只是未触发槽函数。我的情况是socket和操函数在同一线程中,又是UDP数据,粘包也可以区分,可能对你没什么帮助。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了