Chinaunix
标题:
socket 长连接 收错数据
[打印本页]
作者:
tianhailong
时间:
2014-05-27 14:38
标题:
socket 长连接 收错数据
大家好:
我有这样一个问题,client 和 server 使用长连接通信,
client 发送请求, server 处理后 返回结果,
这样依次类推,
但是有个问题,就是不知网络还是什么原因
会出现
client 发送请求,server 处理后,返回结果,但是client 没有收到这个结果,超时后从recv 函数退出,
接着这个client 发送下一个 请求到 server,server处理后,
client 收到了前一次的结果,
怎么解决这样的问题呢? 求教了
作者:
sxcong
时间:
2014-05-27 16:52
每个请求加个序号
自己处理超时,比如多长时间内没收到,再发送一次,然后再recv。
recv时能得到网络状态,如果网络正常的话,就是服务器端程序有问题。
如果程序没问题,长连接不断,服务器会正常回复这个请求的。
另外,如果是用epoll的话,服务器端要不停地收,上一次数据没收完,停止不收了,也不会再有读事件。看不到你程序怎么写的,只能这么推测了。
作者:
sxcong
时间:
2014-05-27 16:53
网络故障client端会收到事件的,所以只能认为服务器端程序有点问题,就是处理了可能没有发出来。
作者:
windoze
时间:
2014-05-27 16:56
所以有一个基本原则是,绝不要继续使用已经出了问题的TCP链接,close掉重连。
作者:
tianhailong
时间:
2014-05-27 17:04
本帖最后由 tianhailong 于 2014-05-27 17:05 编辑
会不会有这种可能性,就是服务端程序也没有问题,发出了,
但是这个包因为路由之类的原因,
走得太慢,这种情况下recv不会收到出错的信息吧?
回复
3#
sxcong
作者:
sxcong
时间:
2014-05-27 17:16
电子走的再慢,也是1秒钟30万公里呀。
TCP的作用就是保持住这个长连接,一有问题肯定会收到的。 所以现在很多软件都不根据网络事件看是否断开,而是根据保活时间。因为网络不稳定,TCP会总断。
我感觉服务器出问题的可能性比较大。还有个办法,你在服务器上开个web服务,然后在客户端用ab做一下测试,看看网络情况怎么样。
作者:
tianhailong
时间:
2014-05-27 17:35
这个服务器一直在运行,出错的概率也比较低,通信很多次后,才会出现几次这样的情况,
而且根据服务端的日志,响应包也是很早就发出了
但是客户端收到的时间比较晚,
所以我觉得是不是网络问题
回复
6#
sxcong
作者:
w_anthony
时间:
2014-05-27 17:57
这个看起来像是事件处理没做好,比如接受端有数据可读,但是没有可读事件,比如ET模式,没有读到EAGAIN就不读了,或者服务器端有数据要发,本来就是可写的,但却在等待可写事件这样永远也等不到。
作者:
sxcong
时间:
2014-05-28 11:09
你可以用第三方工具测试一下,比如telnet。连你的服务器程序测试。这样,客户端肯定没问题,再出错就是服务器或网络了。
同时在你服务器另外装一个长连接的软件server,比如openfire,然后再用客户端连接上测试。如果没有问题,说明网络正常。
这两者都运行正常,那就是你服务器程序了。
或者,你在内网搭建一个环境,一台机器运行server,另一台运行telnet或你的客户端再测试。这样网络环境肯定没问题,如果再出现问题,就要检查你的程序了。
作者:
myworkstation
时间:
2014-05-28 20:20
回复
1#
tianhailong
先排查逻辑上的错误,客户端或者服务器是否在收发包时使用了队列之类的机制,能确定数据包一定发送成功了而不是缓存在本地吗?
作者:
tianhailong
时间:
2014-05-29 10:54
谢谢大家的帮助,之前的问题基本解决了
作者:
jiyulin
时间:
2015-04-23 11:29
在互联网大环境下,有些问题是我们解决不了的,TCP底层有重传机制,所以重复收到数据或者延时收到数据都是正常现象
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2