现有一TClientSocket控件,与服务器保持一个长连接。
介面上有一个“启动”按钮,“停止”按钮。分别是开启这个与服务器的长连接和关闭该长连接。我在“停止”按钮的事件里是这样关闭长连接的:ClientSocket.close;
当我使用  netstat -na  命令观看系统端口情况时,发现有一个本地断口开者,只是它的状态为  Time_Wait.    当我点好多次“启动”和“停止”按钮后,发现有一堆的本地断口,状态都是Time_Wait.当过去一段时间后,再次查看这些本地断口的状态,发现状态变成了Fin_Wait_2   再过去一段时间后,再次查这些本地断口的状态,发现这些断口已经全部消失,就是已经 被系统关闭了。请教一下用ClientSocket.close方法不能真正关闭本地断口吗?

解决方案 »

  1.   

    有人研究过 吗?
    help!!
      

  2.   

    up
    在 TIdTCPClient 里面也有这个问题。
      

  3.   

    mingtom():
    有没有什么 解决方法?
    急啊,老没人回答
      

  4.   

    好象不能,我也见过这样的问题。每次ClientSocket1.open都会打开一个端口,状态为LISTENING。之后ClientSocket1.Close端口还在,以后每OPEN一次都会再打开一个端口。
      

  5.   

    to: highbury()
      抱歉,我暂时也找不到解决的办法。
      看来只有另外分配端口了!
      

  6.   

    TIdTCPClient.Free ;好象这样也不行哎!
      

  7.   

    我也遇到这种问题Tidtcpclient设置了boundpost,退出程序后端口不会立即释放。
      

  8.   

    我今天作过试验了:  若服务器主动关闭,则客户端相应端口的占用会被马上释放。
      反之,若客户端主动关闭,则客户端相应端口的占用不会被马上释放,相应端口的状态为“TIME_WAIT”。  总不能要求人家服务器端在客户端关闭连接后也关闭一下连接吧。若解决此问题,我另外开帖送分-100 决不食言。
    本人有的是分。
      

  9.   

    呵呵  我好象解决了。在关闭时加一句话ClientSocket1.Socket.Disconnect(ClientSocket1.Socket.SocketHandle);
    这样就能把端口释放了。别忘了给分!
      

  10.   

    to : mentalpatient(按时吃药) 
      今天试了一下。
      我用的是 indy 的 TIdTCPClient
      IdTCPClient1.Socket 里面好象没有Disconnect 这一项
      Socket.Close 好象也不行
      Socket.Destroy 也不行
      怎么办呢?
      

  11.   

    就是在点际关闭的时候
      IdTCPClient1.DisConnect;
      IdTCPClient1.Free;
      

  12.   

    tcp/ip本来就是这样,当你在关闭一个socket连接时用netstat -na查看就是Time_Wait.它需要过一段时间后才会自动释放,你可以写一个连接sybase的数据库程序,然后用netstat查看端口情况,其结果也是一样
      

  13.   

    to: chard() 
      没有办法解决了吗?
      

  14.   

    断开连接不是可以先等待对方把数据全传送完之后再断开吗,我忘记应该怎么写了,手头没有资料。那样不知道行不行。
    一个端口断开要等待两倍超时时间的,只是不知道数据传输完了还用不用等。我用TTcpServer 监听端口的时候也有类似的毛病,但是换成TServerSocket 就能立刻断开。
    http://expert.csdn.net/Expert/TopicView1.asp?id=2679010你也可以考虑换个控件试试。