Proto  Local Address          Foreign Address        State
 TCP    192.168.0.25:8503      192.168.0.25:8000      TIME_WAIT
在同一台机器测试程序,服务端打开8000,客户端打开8503,首次打开能够正常建立连接,服务,客户端都关闭再打开,端口号不变,客户端socket调用connect(),出错,这是什么原因?
10多分钟后,再次netstat -na,没有了
TCP    192.168.0.25:8503      192.168.0.25:8000      TIME_WAIT
又能建立连接了。请问怎么才你做到,关闭程序再打开,都能立即建立正常连接啊?

解决方案 »

  1.   

    你把cliect端的socket也做了绑定?client端的socket处于TIME_WAIT状态不能重复绑定,要等到成为CLOSED状态才行。监听socket可以使用套接字选项SO_REFUSEADDR,在TIME_WAIT状态绑定。
      

  2.   

    关闭程序时正确关闭socket可以避免这个问题
    To assure that all data is sent and received on a connected socket before it is closed, an application should use shutdown to close connection before calling closesocket. For example, to initiate a graceful disconnect:
    Call WSAAsyncSelect to register for FD_CLOSE notification. 
    Call shutdown with how=SD_SEND. 
    When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR. 
    Call closesocket. Note  The shutdown function does not block regardless of the SO_LINGER setting on the socket.An application should not rely on being able to reuse a socket after it has been shut down. In particular, a Windows Sockets provider is not required to support the use of connect on a socket that has been shut down.
      

  3.   

    masterz说过了,是你不正常关闭服务端或客户端而导致Socket 没被关闭的现象。