现在C#编写的一个关于GPRS无线传输的项目,通过TCP/IP,程序基本都没什么毛病,但是软件有个现象,
就是客户端(GPRS终端因为信号不很好)会经常掉线,然再重连,导致我服务器软件这边,运行长了以后就会连接不上来,
然后批量的客户端都连接不上了,如果重启监听程序,
又OK。我们检查了资源的问题,但是没有发现毛病。希望有人可以解决,谢谢。
可能有内存泄漏!
这个需要加心跳包来保活,就是每隔固定时间发少量数据,告诉服务器,这个客户端还“活着”。
尽管TCP是“可靠”连接,但现实中有很多因素导致“不可靠”;
套接字本身也有一套保活机制,但默认的设置并不像我们想的那样有效。
你可以通过设置SOCKET的SO_KEEPALIVE和相关参数来处理,也可以在应用层加上自己心跳机制。
用自己的心跳也许更好些,即可以保活,又方便做断线处理。
C#内存泄露一般不会发生吧,C++很常见。
赞同@Higel
做好这么几点:
1. 服务器端保持侦听线程正常运行;
2. 客户端在连接出现问题时,要有重新连接服务器的机制;
3. 服务器端做好异常处理,在连接出现问题时,close相关资源(socket等),结束当前线程(如结束发送数据的死循环..);
一般应该在客户端连接的时候重新注册一下自己的连接,也就是删除原有的连接,加入新的连接,这样服务端向客户端发起通信就可以使用新的连接了。
服务端要经常性的检查下自己。把断开的连接删除吧。
长连接必须保持心跳,如果心跳超时的话,要主动释放客户端的socket连接,如果不释放,下次客户但客户端重连上,又要占一个端口进行连接,普通socket一台机器,服务端大概能连7000个端口,你可以按照这个思路去查下问题