socket完成数据传输任务后,我在server端和client端都调用了函数
shutdown(sNO,SD_BOTH)和closesocket(sNO),结果发现server端的socket仍处于等待状态,当超时后系统才会关闭它。怎样正确地关闭socket或者如何设置socket超时时限。(已设置了SO_DONTLINGER)

解决方案 »

  1.   

    server端和client端关闭socket时序关系应该如何,望知情者指点一二,3X。
      

  2.   

    尝试获取返回值,并使用WSAGetLastError获取错误。
      

  3.   

    返回值都为0,正确地调用了shutdown()和closesocket()函数,不知是什么原因,很是不解。在关闭socket时,各位是如何实现的?谢谢·
      

  4.   

    int CloseSocket(int iSocketId)
    {
    int iResult = 0;
    static struct linger lig;
    lig.l_onoff=1;
    lig.l_linger=0;
    static int iLen=sizeof(struct linger); setsockopt(iSocketId,SOL_SOCKET,SO_LINGER,(char *)&lig,iLen);
    Sleep(17);
    #ifdef WIN32
    iResult = closesocket(iSocketId);
    #else
    iResult = close(iSocketId);
    #endif
    return iResult;
    }
      

  5.   

    选择一种SOCKET通讯机制,
    比如CSOCKET,或者select都很容易自己判断是否close socket
      

  6.   

    查了相关资料后,终于找到问题的症结:
    client端可以正常关闭,但server端关闭(指调用shutdown和closesocket函数)后,socket的状态是TIME WAIT,我查了有关TCP协议的连接原理清访问http://www.rfc-editor.org第RFC793号文件,定义为:
    TIME-WAIT - represents waiting for enough time to pass to be sure
        the remote TCP received the acknowledgment of its connection
        termination request.
    如果在这个enough time 里,我又开启了其他TCP连接(大概10秒一个),系统会有足够的资源可用吗?另外这个enough time 我可以人为指定吗?
      

  7.   

    这个enough time是2倍的MMS, 一般无法修改,至少我不会. :_)
    其实你这个问题换一个角度考虑就可以了.
    server不主动关闭,由client主动关闭. server等client关闭后,read返回0时,被动关闭就可以了,这样server端就干净了,把TIME_WAIT留给client吧.呵呵当然实际中你要灵活运用,我估计sever/client都是你写的吧? 你可以在server端有如下的逻辑: 当准备关闭的时候, 等待client在一段时间内主动关闭, 如果client没有反应,server也只要自己自动关闭了,不可能无限等待...反正一条,谁主动谁倒霉.(需要保持TIME_WAIT状态).具体你自己把握吧.
      

  8.   

    TIME_WAIT是一种很合理的做法,用不着关闭linger。
    庸人自扰!