我设计了一个服务器程序及客户端程序,多个客户端连接服务器。服务器采用SOCKET及多线程处理来自客户端的请求,单台客户端机器请求连接的时候一般没有问题,但是如果多台机器同时访问服务器就会出现服务器无响应,大概要过10-15秒后才有响应,数据才能返回到客户端。在服务器无响应期间,用netstat -an在客户端发现有SYN_SENT请求,但服务器并没有返回。在服务器端用netstat -an并没有发现客户端来的请求(无SYN_RECV)。经调试服务器发现服务器并没有接收到OnAccept消息,上溯到CSocketWnd的OnSocketNotify函数中,也并没有收到Socket发来的连接消息,说明三次握手并没有进行。
百思不得其解,请高手指点。

解决方案 »

  1.   

    另外我分别用CAsyncSocket及Socket加多线程两种情况进行试验,都是存在这种情况,Socket加多线程是在Accept处返回,CAsyncSocket是在OnAccept处无消息,并上溯到CSocketWnd的OnSocketNotify函数中,也并没有收到Socket发来的连接消息,说明三次握手并没有进行。
    我的怀疑是原来的SOCKET连接没有及时清理掉,导致后来的SYN请求不能被接收。但是在服务端用netstat -an并没有发现类似CLOSE_WAIT,TIME_OUT或其他的一类的状态,netstat -an下面除正常的一些连接外,没有其他非正常连接。
    是不是服务器的SYN队列溢出呢?或原来的队列并没有释放?如果是有溢出或没有释放,那应该怎么做才行呢?
      

  2.   

    刚才上面的语句有一个地方打错了,是“Socket加多线程是在Accept处没有返回”