国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > listen(int fd, int backlog)中的backlog含义

listen(int fd, int backlog)中的backlog含义

来源:程序员人生   发布时间:2013-12-26 14:10:38 阅读次数:4853次

  建站学院(LieHuo.Net)文档 backlog应该是未完成3次握手连接和已完成3次握手而未被accept的两对列之和.不知道我说的对不?如果要控制连接数量,是不是要自己编码控制...下面的可以。

以下为引用的内容:
while(1)
{
     while( connNumber <= 10 )//maxconn = 10;
     {
           accept();
           pthread_creat();
           connNumber++;
     }
}
thread()
{
  close(fd);
  connNumber--;
}

  2. Linux Kernel 2.6,listen(5),永不 accept,到底能建立成功多少个连接?

以下为引用的内容:

CODE 1:

 

$ perl -MIO::Socket -e '$s=new IO::Socket::INET( LocalPort => 9999, Listen => 5 ); sleep(1) while 1'

CODE 2:

$ perl -MIO::Socket -le 'foreach(1..100000){ $c=new IO::Socket::INET( PeerAddr => "127.0.0.1:9999" ); redo unless $c; push @c, $c; print }'

CODE 3:

 

$ netstat -nat | grep EST | grep 9999 | wc -l

 3.  关于listen(int sockfd, int backlog)backlog的意思

listen(int sockfd, int backlog);我在书上看到在unix编程中backlog这个表示:当有多个客户端程序和服务端相连时,使用backlog这个表示可以接受的排队长度。但是我在书上看到这个值一般设为5到10之间

以下为引用的内容:

DESCRIPTION
       To  accept  connections,  a  socket  is first created with socket(2), a willingness to accept incoming connections and a queue limit for incoming connections are specified with listen(), and then the connections are accepted with  accept(2).   The  lis-ten() call applies only to sockets of type SOCK_STREAM or SOCK_SEQPACKET.

       The  backlog  parameter  defines  the  maximum  length  the queue of pending connections may grow to.  If a connection request arrives with the queue full the client may receive an error with an indication of ECONNREFUSED or, if the underlying  protocol supports retransmission, the request may be ignored so that retries succeed.

 整个过程是这样的:
 在server端维护了两个队列,一个是完整队列,在这个队列中的描述符都是完成了三次握手的,一个是未完整队列,在这个队列中的描述符还没有接收到客户端最后的那个ACK。
 而我认为在Linux中这个backlog指的就是那个完整队列的长度(实际上按照UNP的说法,这个backlog一直以来都存在混淆),所以说虽然这个队列只能拥有不到20个连接的处理能力,但是对于还没有处理的连接,会存放到未完整队列中的。当完整队列中的描述符被accept取走之后就可以移到完整队列中来了。

 4. windows 2k 里的listen(SOCKET s,int backlog)的第二个参数不起作用吗?

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

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

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生