我写了一个代理服务器程序,工作过程是IE发请求给代理,代理再连结到IIS,并把请求发给IIS,可是出现这样的问题,当IE关闭的时候,代理就关闭和IE通信的socket,并且我也调用closesocket(..)关闭了和IIS通信的socket了,可用netstat -a一看,IIS和代理通信的socket却没有消失,status项为wait_time,直到关掉代理程序,或过段时间自动消失,输出如下:
TCP    Desktop:1255           Desktop:http             TIME_WAIT
  TCP    Desktop:1257           Desktop:http             TIME_WAIT
  TCP    Desktop:1263           Desktop:http             TIME_WAIT
  TCP    Desktop:1265           Desktop:http             TIME_WAIT
  TCP    Desktop:1267           Desktop:http             TIME_WAIT
  TCP    Desktop:1269           Desktop:http             TIME_WAIT
  TCP    Desktop:1275           Desktop:http             TIME_WAIT
  TCP    Desktop:1277           Desktop:http             TIME_WAIT
  TCP    Desktop:1279           Desktop:http             TIME_WAIT
  TCP    Desktop:1281           Desktop:http             TIME_WAIT
  TCP    Desktop:1287           Desktop:http             TIME_WAIT
  TCP    Desktop:1289           Desktop:http             TIME_WAIT
......但是直接用IE请求IIS时,关掉IE却没有这种现象,为什么会出现这种情况?wait_time,是什么意思?表明什么?是程序的什么地方出了问题呢?

解决方案 »

  1.   

    你的问题是服务段不能处理超过xxxx的请求
      

  2.   

    TCP建立和撤销都是往返几步的协议,如果断开时没有友好关闭(如强行终止),那么连接状态就是如此,直到tcp驱动层超时
      

  3.   

    一般来说,tcp正常关闭需要四个包。比如a和b关闭连接,a先给b发一个fin,b会进行确认ack,然后b也会发出fin,当a接受到这个fin,并发出最后一个ack后,就会处于time_wait状态。这个时间长短跟操作系统有关,一般会在1-4分钟,也就是两倍的数据包最大生存时间。
    这样的目的是为了,如果b没有收到a最后的ack,可以进行超时重传fin。所以说,主动发起关闭连接的一方(也就是客户端和服务器在时间上谁先调用closesocket)会进入time_wait状态,这个时候,进程所占用的端口号不能被释放。除非在你的程序中用setsockopt设置端口可重用的选项,但这不是所有操作系统都支持的。
      

  4.   

    你是主动关闭啦,当然要出现这种情况啦。
    可以有几种办法:1、
    LINGER lingerStruct;
    lingerStruct.l_onoff = 1;
    lingerStruct.l_linger = 0;if (SOCKET_ERROR == ::setsockopt(m_socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct)))
    {
    glog.log(__FUNCTION__,"set linger error %d",::WSAGetLastError());
    }
    不过这种办法不是很安全的,不过现在网络都很好啦,不会有问题的。2、修改注册表
    [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters]
    "TcpTimedWaitDelay"=dword:00000005
    这个值好像是300秒到30秒之间,改成30秒后你会发现TIME_WAIT很快就会消失了。
    这个在2000下面是肯定支持的,98下面我没试过,不过服务器你还会用98吗?上面提到REUSEADDR,REUSEPORT,可能对这个用处不是很大的。
      

  5.   

    time_wait!看看tcp/ip的协议tip的状态图!
      

  6.   

    如果没有记错!是一边关闭了!而另外以便没有close连接
      

  7.   

    sevencat(七猫)说的没错,这是tcp/ip的正常终止状态,避免的方法如 sevencat(七猫) 所说,我知道的也就这两种!
      

  8.   

    当IE主动关闭连接的话就会出现这种情况,你可以先发送一个包涵
    connection: close 的头给IIS,那IIS这会主动关闭和IE的连接,应该就不会出现这种情况了!
      

  9.   

    这是正常的tcp状态转换,windows不用设端口重用选项就可重用端口,unix需要设。
      

  10.   

    努力改进中,做一个更好的BT. 
    FastBT下载 1.0.3.66版 2003.12.25 1.修改上传算法. 2.修改一些BUG. 
    http://www.eyeteck.com/caimouse/web/BT.htm
      

  11.   

    唉,TCP/IP太复杂,会了socket类,发现还有那么多层的内容,什么时候到头啊??