- 主题:请教socket编程如何保证响应的时效性
用qt的socket,不知道是qt函数库的问题呢,还是什么问题,通信的时效性无法保证。但听过侦听网络数据包发现从对方读取数据,对方的响应很快,基本在5ms以内就有答复,但是我的应用程序却无法保证在100ms内获取到对方的应答,有的时候可以,有的时候不行。此外,debug版本和release版本的表现也不一样,qt4和qt5编译出来的程序的表现也不一样。感觉进入了一个大坑!
--
FROM 113.70.65.*
估计是代码的问题。
正常不会碰到这样的问题。
我甚至拿 Qt 写一些服务器后端的网络服务程序。已经在生产服务器上运行好几年了。
【 在 hengcuiyuan 的大作中提到: 】
: 用qt的socket,不知道是qt函数库的问题呢,还是什么问题,通信的时效性无法保证。但听过侦听网络数据包发现从对方读取数据,对方的响应很快,基本在5ms以内就有答复,但是我的应用程序却无法保证在100ms内获取到对方的应答,有的时候可以,有的时候不行。此外,debug版本和re
: lease版本的表现也不一样,qt4和qt5编译出来的程序的表现也不一样。感觉进入了一个大坑!
--
FROM 120.37.189.*
我是用来做工业应用程序的,对时效性要求高。代码的问题应该是有,我发现两次通信之间人为的加入200ms(用的是processEvents)的延时,通信的可靠性就好了,基本不会有几秒钟,甚至十几秒都读不到数据的情况(qt4可以,qt5编译的程序也有问题)。
PS:我的通信代码是放在另一个线程里面的,也同样放了延时,但是延时的时间却不能长,长了也会有十几秒读不到数据的情况。
【 在 hgoldfish 的大作中提到: 】
: 估计是代码的问题。
: 正常不会碰到这样的问题。
: 我甚至拿 Qt 写一些服务器后端的网络服务程序。已经在生产服务器上运行好几年了。
: ...................
--
修改:hengcuiyuan FROM 113.70.65.*
FROM 113.70.65.*
别用 Qt 搞网络了。Qt 的网络模块很难用。
但是就算 Qt 的再难用,200ms 的延迟这肯定是你代码写错了。
在没有源代码的情况下无法判断问题出在哪里。建议你仔细看一下 Qt 的文档和别人的项目是怎么写的。
【 在 hengcuiyuan 的大作中提到: 】
: 我是用来做工业应用程序的,对时效性要求高。代码的问题应该是有,我发现两次通信之间人为的加入200ms(用的是processEvents)的延时,通信的可靠性就好了,基本不会有几秒钟,甚至十几秒都读不到数据的情况(qt4可以,qt5编译的程序也有问题)。
: PS:我的通信代码是放在另一个线程里面的,也同样放了延时,但是延时的时间却不能长,长了也会有十几秒读不到数据的情况。
--
FROM 120.37.189.*
qt搞通信是有点难度。研究了一下,可能是readyRead信号的触发问题,我是多线程环境,如果readyRead信号触发了槽函数的执行,而在槽函数未执行完时,又有新的数据到来,好像不会再触发readRead信号,然后我就永远无法读到那后半部分到来的数据了,然后程序就会报通信超时。
【 在 hgoldfish 的大作中提到: 】
: 别用 Qt 搞网络了。Qt 的网络模块很难用。
: 但是就算 Qt 的再难用,200ms 的延迟这肯定是你代码写错了。
: 在没有源代码的情况下无法判断问题出在哪里。建议你仔细看一下 Qt 的文档和别人的项目是怎么写的。
: ...................
--
FROM 113.70.91.*
这时候你要写 while() 循环把所有信息都读完。
【 在 hengcuiyuan 的大作中提到: 】
: qt搞通信是有点难度。研究了一下,可能是readyRead信号的触发问题,我是多线程环境,如果readyRead信号触发了槽函数的执行,而在槽函数未执行完时,又有新的数据到来,好像不会再触发readRead信号,然后我就永远无法读到那后半部分到来的数据了,然后程序就会报通信超时。
--
FROM 120.37.189.*
还有个大坑,有时候不会有readyRead信号,只能在finished的时候readAll一次读完,不知道什么原因
【 在 hengcuiyuan 的大作中提到: 】
: qt搞通信是有点难度。研究了一下,可能是readyRead信号的触发问题,我是多线程环境,如果readyRead信号触发了槽函数的执行,而在槽函数未执行完时,又有新的数据到来,好像不会再触发readRead信号,然后我就永远无法读到那后半部分到来的数据了,然后程序就会报通信超时。
--
FROM 58.34.122.*
哈哈。大魔王来看看我弄的那个 qtng.org 吧。
【 在 missdeer 的大作中提到: 】
: 还有个大坑,有时候不会有readyRead信号,只能在finished的时候readAll一次读完,不知道什么原因
--
FROM 120.37.189.*
看来都是踩过坑的,哈哈。你用的是qt的哪个版本,finished的是什么意思,信号还是函数? 我看qt5现在给的异步通信的例子,是用QDataStream里面的事务来接收数据的,说数据包没有到齐的时候可以回退,然后等待新的readyRead信号,我采用他的示范方案来试试看。
【 在 missdeer 的大作中提到: 】
: 还有个大坑,有时候不会有readyRead信号,只能在finished的时候readAll一次读完,不知道什么原因
--
FROM 113.70.91.*
用while我也想过,这就要设置超时,我看手册上又说响应readyRead信号的槽函数里面不能用processEvent,这个超时又该如何设置呢?我又怎么知道什么时候所有信息读完了呢?
【 在 hgoldfish 的大作中提到: 】
: 这时候你要写 while() 循环把所有信息都读完。
:
--
修改:hengcuiyuan FROM 113.70.91.*
FROM 113.70.91.*