- 主题:请教socket编程如何保证响应的时效性
估计是代码的问题。
正常不会碰到这样的问题。
我甚至拿 Qt 写一些服务器后端的网络服务程序。已经在生产服务器上运行好几年了。
【 在 hengcuiyuan 的大作中提到: 】
: 用qt的socket,不知道是qt函数库的问题呢,还是什么问题,通信的时效性无法保证。但听过侦听网络数据包发现从对方读取数据,对方的响应很快,基本在5ms以内就有答复,但是我的应用程序却无法保证在100ms内获取到对方的应答,有的时候可以,有的时候不行。此外,debug版本和re
: lease版本的表现也不一样,qt4和qt5编译出来的程序的表现也不一样。感觉进入了一个大坑!
--
FROM 120.37.189.*
别用 Qt 搞网络了。Qt 的网络模块很难用。
但是就算 Qt 的再难用,200ms 的延迟这肯定是你代码写错了。
在没有源代码的情况下无法判断问题出在哪里。建议你仔细看一下 Qt 的文档和别人的项目是怎么写的。
【 在 hengcuiyuan 的大作中提到: 】
: 我是用来做工业应用程序的,对时效性要求高。代码的问题应该是有,我发现两次通信之间人为的加入200ms(用的是processEvents)的延时,通信的可靠性就好了,基本不会有几秒钟,甚至十几秒都读不到数据的情况(qt4可以,qt5编译的程序也有问题)。
: PS:我的通信代码是放在另一个线程里面的,也同样放了延时,但是延时的时间却不能长,长了也会有十几秒读不到数据的情况。
--
FROM 120.37.189.*
这时候你要写 while() 循环把所有信息都读完。
【 在 hengcuiyuan 的大作中提到: 】
: qt搞通信是有点难度。研究了一下,可能是readyRead信号的触发问题,我是多线程环境,如果readyRead信号触发了槽函数的执行,而在槽函数未执行完时,又有新的数据到来,好像不会再触发readRead信号,然后我就永远无法读到那后半部分到来的数据了,然后程序就会报通信超时。
--
FROM 120.37.189.*
哈哈。大魔王来看看我弄的那个 qtng.org 吧。
【 在 missdeer 的大作中提到: 】
: 还有个大坑,有时候不会有readyRead信号,只能在finished的时候readAll一次读完,不知道什么原因
--
FROM 120.37.189.*
有 while (socket.bytesAvailabe() > 0) { socket.read(...); ... } 这样子。
【 在 hengcuiyuan 的大作中提到: 】
: 用while我也想过,这就要设置超时,我看手册上又说响应readyRead信号的槽函数里面不能用processEvent,这个超时又该如何设置呢?我又怎么知道什么时候所有信息读完了呢?
--
FROM 223.104.162.*
我已经在生产环境用一年多了。不过可能很多 corner case 没搞定。反正你也懂 Qt 啊。。有时候帮忙 debug 一下。。
【 在 missdeer 的大作中提到: 】
: 这个成熟度如何了,能在生产环境用吗?我倒是真有coroutine这种需求
--
FROM 223.104.162.*
其实随便用。。我再想想怎么加上静态链接的免除条款。做到随便静态链接也可以。当然,改动了 qtng 本身,还是希望能够开源出来大家一起用。不要像 bsd 协议那样被大厂商随便白嫖。
【 在 callmebbser 的大作中提到: 】
: 记得以前金鱼总的QtNg是GPL版权,刚打开看,发现版权改为LGPL 3.0了。
: 赞!
--
FROM 120.37.189.*
Qt 的 socket 模型是单线程的话,,你用多线程通常就错了。
【 在 hengcuiyuan 的大作中提到: 】
: 问题找到了,就是卡在readyRead的槽函数里面,当在槽函数里面执行的时候,有新数据到来,但这个新数据并不会再次有readyRead信号发出,后面的数据接收和处理程序就一直在傻等数据到齐,因而导致的通信超时。多线程的时候这种概率大,不搞多线程的时候没问题。
--
FROM 110.81.146.*
你可以把不同的 socket 放在不同的线程里面,但是 Qt 是不允许一个 socket 供多个线程使用的。
【 在 hengcuiyuan 的大作中提到: 】
: qt说他是多线程的,^_^
--
FROM 125.78.66.*
Qt 的 TCP 虽然难用。但发送丢数据。这几乎是不可能的啊。
【 在 hengcuiyuan 的大作中提到: 】
: TCP,QT的坑绝对多,现在又碰到个问题,QImageReader读图的时候,大于30M的BMP图片就读不进来了,直接返回NULL,服了,我还是64位程序。
--
FROM 124.72.118.*