我调用监听的时候listen(s, 20);然后很多客户端断开重连,断开重连,当连接断开1W多次后,就出现客户端连接不上的情况了,connect返回的错误是10061。当我改成这样的调用:listen(s, 2000);
这样重复断开连接30多W次都没问题,,,但是我觉得很奇怪,,到底是怎么回事,有没有人遇到过?
按道理不应该这样的啊,,

解决方案 »

  1.   

    呵呵 楼主你把listen把第二个参数从20改成2000 改的很对啊  
    当accept()不能接收大量的等待接收的SOCKET时或者说存放等待接收连接的队列满时 后面的等待连接的套接字都会失败。
    主要你要明白listen第二个参数的意义-------------------------------
    然后很多客户端断开重连,断开重连,当连接断开1W多次后,就出现客户端连接不上的情况了,connect返回的错误是10061。
    ---------------------------------------------------
    如果connect失败后 你休眠一小段时间继续连接 还有连接成功的可能
      

  2.   

    to 楼主:
       你的服务器端使用的IO模型是IOCP吧,我在测试时得到和你类似的情况。
       另外,我发现服务器端的Accept调用返回的是INVALID_SOCKET,而WSAGetLastError()返回的是10038(WSAENOTSOCK:无效套接字上的套接字操作。任何一个把SOCKET句柄当作参数的Winsock函数都会返回这个错误。它表明提供的套接字句柄无效。)
       接着就发现:服务器端accept调用的那个监听Socket参数已经不是最初的值!!!
       也就是说监听Socket句柄改变了,为什么?
    BTW:你的另外一个帖子中设计的问题我同样遇到,觉得和这里的问题有一定的联系。
    (http://community.csdn.net/Expert/topic/3171/3171912.xml?temp=.316723)