listen的原型
int listen(
  SOCKET s,    
  int backlog  
);
对backlog的说明: 
[in] Maximum length of the queue of pending connections. If set to SOMAXCONN, the underlying service provider responsible for socket s will set the backlog to a maximum reasonable value. There is no standard provision to obtain the actual backlog value. 应该是可以设定接入连接数的。我用下面的代码还是可以接入。
把backlog设成1,接进多少台都没问题。请问我哪里设的有问题吗?谢谢。 if (SOCKET_ERROR == listen (s, 0))  
{
printf ("Listen failed: %u\n", GetLastError ());
    closesocket(s) ;
return(FALSE);
}
else
{
printf("Listening ! \n");
}

解决方案 »

  1.   

    有比如同时有10个连接请求,如果你的listen(s,5)的话,其他5个请求就会返回忙的信息,客户端就得重试。也就是说,值的大小就是对连接缓冲的大小
      

  2.   

    《TCP/IP详解 卷1:协议》的Page195有详细解释。
    1)backlog 用于在TCP层接收链接的缓冲池的最大个数,这个个数可在应用层中的listen函数里设置,当客户链接请求大于这个个数(缓冲池满),其它的未进入链接缓冲池的客户端在tcp层上tcp模块会自动重新链接,直到超时(大约57秒后)
    2)我们的应用层的链接完成是要从tcp层的链接缓冲池中移出一个(accept函数实现)
      

  3.   

    backlog是连接请求队列的最大长度。
    1.在WinSock1.1中最大值5。如果backlog小于1,则backlog被置喂1;若backlog大于SOMAXCONN(定义在winsock.h中,值为5),则backlog被置为SOMAXCONN。
    2.在WinSock2中,没有制定具体值,它由服务提供者决定
    3.有时候backlog设置很小,这时我们接进多少台机器都没问题是因为服务器机器处理速度很快队列来不及填满就处理完了,而且在同一个时刻到来的连接还是很少的
      

  4.   

    那意思是不是backlog设定的只是同时发生的accept数,接就是说,不管已经有多少个connection已经在了,只要在某一时可同时接入的connect 小于backlog,就可以接入?
        我做的实验是,backlog设为1时,在另一台机子同时开若干个连接tcp同时保持连接状态(connecting),还是可以继续链入。
       实际上我是想用它来设定本server的connection数。
       是不是应该用别的来做?
      

  5.   

    用别的做,要么没accpet一次则将某个成员变量加一。你对backlog 的意思还是没了解透,我建议你找《TCP/IP详解 卷1:协议》看看
      

  6.   

    是这个意思,
    如果想限制本server的连接数,我通常的做法是在Server收到连接请求的时候,做个计数值成功连接则增加一,当连接断开的时候就减一。在这之前自己可以设置一个宏指定连接数的最大值,每次收到连接时判断计数值是否超过设置的宏值(最大连接数)。超过了则发给客户端消息告诉他已经超过Server的最大连接数,然后closesocket()关闭刚建立的连接就可以了。
    宏就是server限制的connection数。
      

  7.   

    谢谢前边几位给的建议,我现在已经是按along008(风筝)的方法作的了,你说的计数值,应该是全局变量吧?是不是对它读写的时候,还有必要同步一下?