我的通讯程序的服务端是多线程的,在接收一定量的客户端连接请求后不能再与客户端建立连接。需要重新启动服务端,甚至电脑。
从网上查了一下,有些朋友说可能是资源没有释放,即socket连接没有释放,我看了一下程序,在线程结束前的finally中已经释放了资源:
      closesocket(m_AcceptSocket);
      m_AcceptSocket := INVALID_SOCKET;但是问题依旧存在,请高手指点一下,不胜感激!  

解决方案 »

  1.   

    用netstat命令看看是不是有很多TIME_WAIT
      

  2.   

    一个进程能管理的线程数是有限的,window一般不超过2000个,操作系统能管理的线程数量也是有限的 
      

  3.   

    toideation_shang ,考虑到客户端的个数,我的程序中定义的服务端线程数是8个,线程执行完应该释放所有的资源,部分代码如下:
    finally                                       // 1
          closesocket(m_AcceptSocket);
          m_AcceptSocket := INVALID_SOCKET;
          g_ItemSingleton.ManageSoeket.IsUse[m_Serial] := False;
          g_ItemSingleton.ManageSoeket.IsStart[m_Serial] := False;
        end; //1
      finally                                         // 0
        CoUninitialize;
      

  4.   

    to unsigned ,“用netstat命令看看是不是有很多TIME_WAIT”,有很多TIME_WAIT,代表什么意思?我现在的电脑(不是通讯机)也有很多TIME_WAIT。
      

  5.   

    修改注册表
    [code=INIFile]Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
    "MaxUserPort"=dword:0000fffe
    "TcpTimedWaitDelay"=dword:00000005[/code]
      

  6.   

    TcpTimedWaitDelay描述:确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多连接,导致低吞吐量,则调整此参数。 如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值。 将此值设置为十进制 30,其为十六进制 0x0000001e。该值将等待时间设置为 30 秒。 停止并重新启动系统。 缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。 建议值:最小值为 0x1E,它将等待时间设置为 30 秒。MaxUserPort 描述:确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。 如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值。 停止并重新启动系统。 缺省值:无 建议值:至少十进制 32768。 注:当在 Windows NT 或 Windows 2000 操作系统上调整 WebSphere Application Server 时,同时使用这两个参数。希望本站的知识能给您的工作、学习和生活带来方便和乐趣!
     
    我用的端口号是3001,
      

  7.   

    to to unsigned 朋友:
    netstat    -t 显示TCP协议的连接情况。
    ==========================================================
    C:\Documents and Settings\Administrator>netstat -t
    活动连接
      协议   本地地址               外部地址               状态            卸载状态  TCP    dqgjj-server-wi:1578   ABC:netbios-ssn        ESTABLISHED     主栈中  TCP    dqgjj-server-wi:3001   198.1.1.5:31748        CLOSE_WAIT      主栈中  TCP    dqgjj-server-wi:3001   198.1.1.5:31787        CLOSE_WAIT      主栈中  TCP    dqgjj-server-wi:3001   198.1.1.5:31804        CLOSE_WAIT      主栈中  TCP    dqgjj-server-wi:3001   198.1.1.5:31824        CLOSE_WAIT      主栈中  TCP    dqgjj-server-wi:3001   198.1.1.5:39268        CLOSE_WAIT      主栈中  TCP    dqgjj-server-wi:ms-wbt-server  YSICE:2141             ESTABLISHED
    主栈中
      TCP    dqgjj-server-wi:ms-wbt-server  MICROSOF-D6DCF5:2344   ESTABLISHED
    主栈中
    =================================================================
    在程序中,监听端口为3001,socket等待连接队列的最大长度为5,如上所示:有5个连接还在等待关闭,并没有关闭。
    是不是等待队列已经满了,并且不能释放这5个连接,所以拒绝接收新的请求,