下面代码,每隔段时间执行一次,发现创建了很多个端口显示TIME_WAIT,执行了close为何端口不能彻底关闭!
CSocket* pSocket;
pSocket=new CSocket;
ASSERT(pSocket);
pSocket->Create())
pSocket->Connect(IP,nPort)
.....
pSocket->Close();//关闭端口
delete pSocket;
return TRUE;

解决方案 »

  1.   

    // 关闭Socket连接 and WSACleanup()
    BOOL CClientSocket::Close ()
    {
    if (INVALID_SOCKET != m_hSocket)
    {
    // shutdown(m_hSocket,2);
    int iClose = closesocket(m_hSocket);
    if (iClose == SOCKET_ERROR)
    {
    TRACE(_T("closesocket() socket error: %d..\n"),GetLastError ());
    }
    if (WSACleanup () == SOCKET_ERROR)
    {
    TRACE(_T("WSACleanup () socket error: %d..\n"),GetLastError ());
    }
    }
    m_hSocket = INVALID_SOCKET;
    m_bConnected = FALSE;
    return TRUE;
    }
      

  2.   

    先用shutdown来禁止发送接受数据,在用closesocket来释放SOCKET所占的资源
      

  3.   

    BOOL CYourSocket::Close()
    {
    LINGER  lingerStruct;
    lingerStruct.l_onoff = 1;
    lingerStruct.l_linger = 0;
    setsockopt(m_hSocket, SOL_SOCKET, SO_LINGER,(char *)&lingerStruct, sizeof(lingerStruct) );
    return CSocket::Close();
    }
      

  4.   

    晕,楼主应该看一下TCP的状态变迁图,在主动关闭一个TCP连接时,正常情况下TCP状态为:FIN_WAIT1-->FIN_WAIT2-->TIME_WAIT-->CLOSED.
    其中TIME_WAIT状态要维持2MSL时间(几分钟吧,不同系统有不同的MSL时间)。P.S. MSL:Maximum Segment Lifetime(报文段最大生存时间)