首页 新闻 会员 周边

SOCKET长连接问题解决

1
悬赏园豆:100 [待解决问题]
现在C#编写的一个关于GPRS无线传输的项目,通过TCP/IP,程序基本都没什么毛病,但是软件有个现象,
就是客户端(GPRS终端因为信号不很好)会经常掉线,然再重连,导致我服务器软件这边,运行长了以后就会连接不上来,
然后批量的客户端都连接不上了,如果重启监听程序,
又OK。我们检查了资源的问题,但是没有发现毛病。希望有人可以解决,谢谢。
大连思绪软件工作室的主页 大连思绪软件工作室 | 初学一级 | 园豆:100
提问于:2011-11-16 20:40
< >
分享
所有回答(8)
0

可能有内存泄漏!

江大渔 | 园豆:267 (菜鸟二级) | 2011-11-17 09:26
2

这个需要加心跳包来保活,就是每隔固定时间发少量数据,告诉服务器,这个客户端还“活着”。
尽管TCP是“可靠”连接,但现实中有很多因素导致“不可靠”;
套接字本身也有一套保活机制,但默认的设置并不像我们想的那样有效。

你可以通过设置SOCKET的SO_KEEPALIVE和相关参数来处理,也可以在应用层加上自己心跳机制。
用自己的心跳也许更好些,即可以保活,又方便做断线处理。

Higel | 园豆:464 (菜鸟二级) | 2011-11-17 09:40
0

C#内存泄露一般不会发生吧,C++很常见。

[CC] | 园豆:61 (初学一级) | 2011-11-17 10:01
0

赞同@Higel

马战鹏 | 园豆:432 (菜鸟二级) | 2011-11-17 10:08
0

做好这么几点:

1. 服务器端保持侦听线程正常运行;

2. 客户端在连接出现问题时,要有重新连接服务器的机制;

3. 服务器端做好异常处理,在连接出现问题时,close相关资源(socket等),结束当前线程(如结束发送数据的死循环..);

dboy8454 | 园豆:174 (初学一级) | 2011-11-17 10:37
0

一般应该在客户端连接的时候重新注册一下自己的连接,也就是删除原有的连接,加入新的连接,这样服务端向客户端发起通信就可以使用新的连接了。

kent06 | 园豆:207 (菜鸟二级) | 2011-11-17 10:55
0

服务端要经常性的检查下自己。把断开的连接删除吧。

forhells | 园豆:724 (小虾三级) | 2011-11-17 22:51
0

长连接必须保持心跳,如果心跳超时的话,要主动释放客户端的socket连接,如果不释放,下次客户但客户端重连上,又要占一个端口进行连接,普通socket一台机器,服务端大概能连7000个端口,你可以按照这个思路去查下问题

diorlv | 园豆:259 (菜鸟二级) | 2014-11-17 16:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册