服务器和子客户在同一台机器上
当我的服务器accept()一个端口后,和 子客户交互的端口 通信,通信完毕后
调用closesocket() 以及shutdown()。然后用netstat -an 看开放的端口。发现有大量的以及调用closesocket() 以及shutdown()。的端口 在TIMEWAIT状态。过一段时间后我的计算机 的端口全被这样的占用,不能在新接受连接,请教这样的情况如何避免。

解决方案 »

  1.   

    Close的时候设置SO_LINGER为0//强行关闭一个socket
    void ForceCloseSocket(SOCKET &s,bool bClose)
    {
       bool bDontLinger=false;
       setsockopt(s,
                  SOL_SOCKET,
                  SO_DONTLINGER,
                  (char *)&bDontLinger,
                  sizeof(bool));   linger InternalLinger;
       InternalLinger.l_onoff=1;
       InternalLinger.l_linger=0;
       setsockopt(s,
                  SOL_SOCKET,
                  SO_LINGER,
                  (const char*)&InternalLinger,
                  sizeof(linger));
      if(bClose)
      {
         closesocket(s);
         s=INVALID_SOCKET;
      }
    }
      

  2.   

    bool bDontLinger = false;
    setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
    int iRes=closesocket(s);
    s=NULL;
    return iRes;问题依旧啊 怪异了啊 我看了msdn上写的 这个选项确实是 去掉TIMEWAIT的 可是我用了没效果
      

  3.   

    怎么还得设置InternalLinger.l_onoff=1;啊?
    Does not block close waiting for unsent data to be sent. Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero.是不是我设置反了。。
    反着设置貌似没问题了。
      

  4.   

    int   nReuseOn=1;
      setsockopt(sock,   SOL_SOCKET,   SO_REUSEADDR,   (char   *)&nReuseOn,   sizeof(nReuseOn));将端口设置成可重用
      

  5.   

    应该是bool bDontLinger = true吧?不TimeWait = true
      

  6.   

    首先设置Dont Linger为false,即打开Linger选项,使之相关设置生效,然后再把Linger的时间设置为0。
      

  7.   

    导致的原因是在某一方close的时候,两方分别要发送和接受两个包:FIN,ACK,假如服务器关闭或者退出,造成客户地址和端口处于TIME_WAIT状态,如果被动方发送的FIN包没有被主动方收到,则处于CLOSE_WAIT状态设置SO_LINGER套接字选项表示:从容关闭还是强行关闭?l_onoff=1表示从容关闭,发送关闭fin包后,等待是否有没有发完的数据包,而等待的时间就是用l_linger来设置linger m_sLinger;m_sLinger.l_onoff = 1; // (在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)m_sLinger.l_linger = 0; // (容许逗留的时间为0秒)setsockopt(sockConnected,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));我们避免不了WAIT状态冻结的再次出现,只能做到使影响降到最小,希望那个重用套接字选项能够使得下一次重新建立连接时可以重用那些处于WAIT状态的端口