最近用 XE2的 DataSnap功能开发了一个Androrid应用服务程序,采用http协议。在使用过程中发现一个问题,如果手机没有正常退出,在服务器上就会出现大量的TCP死连接,而这些死连接却不有被操作系统清除掉。当死连接越来越多时,导致服务程序的线程无法释放,并且大量的内存。这样新的手机程序无法再登录。如何能解决这些TCP死连接呢? 修改服务器上的KeepAliveTime设置。 tcp协议,在三次握手成功即表示连接建立,之后若一方异常断开而没有通知对方,也就是没有主动断开连接。那么另一方是不知道的,他以为对方一直还在。 winsock为了解决这个问题提供了一个keepalive的参数设置项,可以用来设置在tcp层每隔一段时间发送心跳数据来探测对方是否还在,如果不在,socket的发送和接收函数会返回响应的错误。因此你只要设置这个参数,然后再发送或接收的时候处理错误即可。 当然你也可以不使用这个参数项,而自己在上层的协议中加入心跳保活机制,当然也就需要你自己处理和设计相关的协议了。 如果你只是使用socket控件而不知其所以然,以及控件的具体实现,那你很难处理这个问题。 socket的TCP keep-alive默认是关闭的,需要自己调用WSAIoctl(dwIoControlCode参数为SIO_KEEPALIVE_VALS)或者setsockopt(level参数为SO_KEEPALIVE)来启用。 |
|