免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4616 | 回复: 11
打印 上一主题 下一主题

[C] socket 长连接 收错数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-27 14:38 |只看该作者 |倒序浏览

大家好:

             我有这样一个问题,client 和 server 使用长连接通信,
             client 发送请求, server 处理后 返回结果,
             这样依次类推,
             但是有个问题,就是不知网络还是什么原因
             会出现
             client 发送请求,server 处理后,返回结果,但是client 没有收到这个结果,超时后从recv 函数退出,
             接着这个client 发送下一个 请求到 server,server处理后,
             client 收到了前一次的结果,
             怎么解决这样的问题呢? 求教了

论坛徽章:
0
2 [报告]
发表于 2014-05-27 16:52 |只看该作者
每个请求加个序号
自己处理超时,比如多长时间内没收到,再发送一次,然后再recv。
recv时能得到网络状态,如果网络正常的话,就是服务器端程序有问题。
如果程序没问题,长连接不断,服务器会正常回复这个请求的。

另外,如果是用epoll的话,服务器端要不停地收,上一次数据没收完,停止不收了,也不会再有读事件。看不到你程序怎么写的,只能这么推测了。

论坛徽章:
0
3 [报告]
发表于 2014-05-27 16:53 |只看该作者
网络故障client端会收到事件的,所以只能认为服务器端程序有点问题,就是处理了可能没有发出来。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
4 [报告]
发表于 2014-05-27 16:56 |只看该作者
所以有一个基本原则是,绝不要继续使用已经出了问题的TCP链接,close掉重连。

论坛徽章:
0
5 [报告]
发表于 2014-05-27 17:04 |只看该作者
本帖最后由 tianhailong 于 2014-05-27 17:05 编辑

会不会有这种可能性,就是服务端程序也没有问题,发出了,
但是这个包因为路由之类的原因,
走得太慢,这种情况下recv不会收到出错的信息吧?回复 3# sxcong


   

论坛徽章:
0
6 [报告]
发表于 2014-05-27 17:16 |只看该作者
电子走的再慢,也是1秒钟30万公里呀。
TCP的作用就是保持住这个长连接,一有问题肯定会收到的。 所以现在很多软件都不根据网络事件看是否断开,而是根据保活时间。因为网络不稳定,TCP会总断。
我感觉服务器出问题的可能性比较大。还有个办法,你在服务器上开个web服务,然后在客户端用ab做一下测试,看看网络情况怎么样。

论坛徽章:
0
7 [报告]
发表于 2014-05-27 17:35 |只看该作者
这个服务器一直在运行,出错的概率也比较低,通信很多次后,才会出现几次这样的情况,
而且根据服务端的日志,响应包也是很早就发出了
但是客户端收到的时间比较晚,
所以我觉得是不是网络问题回复 6# sxcong


   

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
8 [报告]
发表于 2014-05-27 17:57 |只看该作者
这个看起来像是事件处理没做好,比如接受端有数据可读,但是没有可读事件,比如ET模式,没有读到EAGAIN就不读了,或者服务器端有数据要发,本来就是可写的,但却在等待可写事件这样永远也等不到。

论坛徽章:
0
9 [报告]
发表于 2014-05-28 11:09 |只看该作者
你可以用第三方工具测试一下,比如telnet。连你的服务器程序测试。这样,客户端肯定没问题,再出错就是服务器或网络了。

同时在你服务器另外装一个长连接的软件server,比如openfire,然后再用客户端连接上测试。如果没有问题,说明网络正常。

这两者都运行正常,那就是你服务器程序了。

或者,你在内网搭建一个环境,一台机器运行server,另一台运行telnet或你的客户端再测试。这样网络环境肯定没问题,如果再出现问题,就要检查你的程序了。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
10 [报告]
发表于 2014-05-28 20:20 |只看该作者
回复 1# tianhailong


    先排查逻辑上的错误,客户端或者服务器是否在收发包时使用了队列之类的机制,能确定数据包一定发送成功了而不是缓存在本地吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP