注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

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

2014-08-06 22:21:32|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

记得这个自己总结过,但在网络编程这个模块里没有找到,只好把别人的发一次。其实这个东西还是比较重要的,要认真的把握一下,最好可以看一下LINUX内核中的源码。

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

http://www.veryhuo.com 2009-01-14 cnblogs 投递稿件 我有话说

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

以下为引用的内容:

while(1)

{

     while( connNumber <= 10 )//maxconn = 10;

     {

           accept();

           pthread_creat();

           connNumber++;

     }

}

thread()

{

  close(fd);

  connNumber--;

}

  2. Linux Kernel 2.6listen(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这个表示可以接受的排队长度。但是我在书上看到这个值一般设为510之间

 

以下为引用的内容:

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 里的listenSOCKET s,int backlog)的第二个参数不起作用吗?

 

TCP/IP详解   1:协议》的Page195有详细解释。  

  1backlog   用于在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设置很小,这时我们接进多少台机器都没问题是因为服务器机器处理速度很快队列来不及填满就处理完了,而且在同一个时刻到来的连接还是很少的。

  评论这张
 
阅读(433)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017