现有一TClientSocket控件,与服务器保持一个长连接。
介面上有一个“启动”按钮,“停止”按钮。分别是开启这个与服务器的长连接和关闭该长连接。我在“停止”按钮的事件里是这样关闭长连接的:ClientSocket.close;
当我使用 netstat -na 命令观看系统端口情况时,发现有一个本地断口开者,只是它的状态为 Time_Wait. 当我点好多次“启动”和“停止”按钮后,发现有一堆的本地断口,状态都是Time_Wait.当过去一段时间后,再次查看这些本地断口的状态,发现状态变成了Fin_Wait_2 再过去一段时间后,再次查这些本地断口的状态,发现这些断口已经全部消失,就是已经 被系统关闭了。请教一下用ClientSocket.close方法不能真正关闭本地断口吗?
介面上有一个“启动”按钮,“停止”按钮。分别是开启这个与服务器的长连接和关闭该长连接。我在“停止”按钮的事件里是这样关闭长连接的:ClientSocket.close;
当我使用 netstat -na 命令观看系统端口情况时,发现有一个本地断口开者,只是它的状态为 Time_Wait. 当我点好多次“启动”和“停止”按钮后,发现有一堆的本地断口,状态都是Time_Wait.当过去一段时间后,再次查看这些本地断口的状态,发现状态变成了Fin_Wait_2 再过去一段时间后,再次查这些本地断口的状态,发现这些断口已经全部消失,就是已经 被系统关闭了。请教一下用ClientSocket.close方法不能真正关闭本地断口吗?
help!!
在 TIdTCPClient 里面也有这个问题。
有没有什么 解决方法?
急啊,老没人回答
抱歉,我暂时也找不到解决的办法。
看来只有另外分配端口了!
反之,若客户端主动关闭,则客户端相应端口的占用不会被马上释放,相应端口的状态为“TIME_WAIT”。 总不能要求人家服务器端在客户端关闭连接后也关闭一下连接吧。若解决此问题,我另外开帖送分-100 决不食言。
本人有的是分。
这样就能把端口释放了。别忘了给分!
今天试了一下。
我用的是 indy 的 TIdTCPClient
IdTCPClient1.Socket 里面好象没有Disconnect 这一项
Socket.Close 好象也不行
Socket.Destroy 也不行
怎么办呢?
IdTCPClient1.DisConnect;
IdTCPClient1.Free;
没有办法解决了吗?
一个端口断开要等待两倍超时时间的,只是不知道数据传输完了还用不用等。我用TTcpServer 监听端口的时候也有类似的毛病,但是换成TServerSocket 就能立刻断开。
http://expert.csdn.net/Expert/TopicView1.asp?id=2679010你也可以考虑换个控件试试。