服务器用soket监听(没用MFC),终端定时向服务器发送数据,数据量很小,发送完毕后即断开连接,服务器接收到连接请求后即处理接收的数据然后断开连接。
现在问题来了:
  在终端少的情况下没问题,终端数很多(70个以上,每个终端同时有三个线程向服务器发起连接并发送数据然后断开连接),这时过一段时间服务器但无法接收到数据包,终端连接也会失败。
  分析知道是服务器端的socket关闭需要时间,正处于TIME_WAIT状态,由于同一时间连接请求太多导致没有连接资源可用,通过setsocketoption使socket关闭时不经历TIME_WAIT状态,似乎问题解决了,但自己经过测试后发现,在连接请求数超过17万个左右之后会出现WSAENOBUF的问题,表现为终端无法连接,服务器Accept返回WSAENOBUF。
  这是怎么回事呢?我看了程序该释放的资源都释放了,socket也关闭了,怎么办啊?请各位高手帮帮忙!

解决方案 »

  1.   

    这是“攻击”啊
    TIME_WAIT是不能彻底取消的。系统需要它。
      

  2.   

    加内存
    SOCKET需要消耗系统的不可分片内存,大约是主内存的一半可以用来分配
    不够就会出现这样的问题
      

  3.   

    谢谢danscort2000(danscort.yu)!
    我更改内存大小试试。
    但是即使更改内存也会有“用尽”的时候啊,如何使得程序“永久”运行而不出现内存不足呢?
      

  4.   

    你的根本问题可能在代码:
    你的socket是不是用的指针?那么这个socket最后销毁了吗?是在哪里销毁的?在不在创建它的线程内?
      

  5.   

    你的程序肯定有地方没释放干净导致内存泄漏
    另外不明白终端为什么要断开连接而不是连接上了以后一直重用socket,才70多个而已啊
    频繁connect也是很耗费资源的
    -------------------------------------------------------
    广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
      

  6.   

    chenliankun(wwp) :我的代码没有使用指针,直接用的socket,没用MFC也没有指针。
    fantiyu(fantiyu):谢谢,我也觉得应该是哪儿的内存没释放,但始终不看不明白。
    对于为什么要断开连接是因为最初程序设计考虑到远程,可能网络状况很不好随时可能会断,所以才采用连接后传输数据后就断开的设计。此外由于终端是随时登录随时传输数据,然后又可能随时断开,即终端具有不确定性。因此才有上述的设计。
      但我现在始终找不到问题在哪儿,难道socket的内存清除除了shutdown、closesocket还有其它什么地方要注意吗?
      

  7.   

    在服务器端处理客户端断开时,把Socket采用Dot Linger的方式,使得不出现Time_Wait.//强行关闭一个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;
      }
    }
      

  8.   

    unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回):谢谢,你提供的代码我之前已经试过了,不行的,还是一样的效果。
      

  9.   

    是不是客户端你也是在本机?如果是的话,客户端也需要ForceCloseSocket.