回复: 请教关于QTCPServer和QTcpSocket的问题
#6 回 海森堡 的帖子 [20091001753 01-13 20:27]
海森堡:请问这个过程中,是QTcpServer产生了timeout无法发送信息,还是QTcpServer产生了timeout无法接收信息呢?它们的默认timeout分别是多少呢?我在文档上找到的信息,都是关于connect的timeout,没有说一段时间不用以后,多久会断开。 (2021-01-12 21:26)
客户端与服务端通讯,是2个QTcpSocket通讯,区别在于服务端还有一个QTcpServer用于监听端口。
在这个过程中,服务端的 QTcpSocket 是由 QTcpServer 创建的,并不涉及到 timeout
#7 回 海森堡 的帖子 [clickto 01-13 20:54]
海森堡:请问这个过程中,是QTcpServer产生了timeout无法发送信息,还是QTcpServer产生了timeout无法接收信息呢?它们的默认timeout分别是多少呢?我在文档上找到的信息,都是关于connect的timeout,没有说一段时间不用以后,多久会断开。 (2021-01-12 21:26)
实测,我遇到的这种中断,并不是确定的timeout或者其他的连接断开。因为如果是连接断开的话,两个socket的state会有变化,同时也会发生disconnect信号。但是我这种情况并没有上述现象发生,查看服务器和客户端的两个socket,都是联通状态,但是过一段时间没有通信后,可以看到客户端确实发送了请求数据,但是服务器端并没有接受到数据。应该就像版主说的,被网关截断了。
#8 [onlyone 01-14 14:49]
看你的描述,是1个socket监听,4个tcp客户端连接。要注意如下关键点:
1)模型是用的slect机制吗,阻塞还是异步。qt默认是使用信号曹的异步机制的。如果是异步,则自己要及时读取消息,或者干脆消息不满足则啥也不读,等满足完整报文再处理。
2)网络封包,需要有一套格式,不能乱收,比如先收头部,头部有报文的整体长度,等全部数据长度过来,再接受,否则等第二次信号。
3)多线程的问题。看看网络是不是io很大,如果很大,则是不是有网络io阻塞问题。这样必须换带宽更大的路由器。如果是单线程处理不过来,cpu反应慢,需要考虑多线程编程。
可能的问题很多。但是我觉得,还是你编程错误导致的,或者Ip冲突等低级错误。
#9 回 clickto 的帖子 [海森堡 01-14 19:20]
clickto:实测,我遇到的这种中断,并不是确定的timeout或者其他的连接断开。因为如果是连接断开的话,两个socket的state会有变化,同时也会发生disconnect信号。但是我这种情况并没有上述现象发生,查看服务器和客户端的两个socket,都是联通状态,但是过一段时间没有通信后,可以看到客 .. (2021-01-13 20:54)
你这个信息很关键,证实了我的推测。在你不直接做相关设置的情况下(使用setsockopt),其实QTcpSocket本身不用管timeout的问题,而是由系统来控制的。
我估计其实是注册表来控制超时时间,参考文章:
https://blog.csdn.net/libaineu2004/article/details/49054261
#10 [海森堡 01-14 19:25]
>>应该就像版主说的,被网关截断了。
这句话我不同意,我认为是被OS截断了。当然网关截断也有可能,但比较小。