我是靠谱客的博主 敏感大神,最近开发中收集的这篇文章主要介绍listen(int fd, int backlog)中的backlog含义,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. listen(int fd, int backlog)中的backlog不能限制连接数量???

http://bbs.chinaunix.net/viewthread.php?tid=870564

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,到底能建立成功多少个连接?

http://bbs.chinaunix.net/viewthread.php?tid=1259656&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1

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的意思(诚心求教)

http://linux.chinaunix.net/bbs/viewthread.php?tid=1042212

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取走之后就可以移到完整队列中来了。
你可以看看这个贴子,里面的实验可以说明:
http://bbs.chinaunix.net/viewthread.php?tid=1259656&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1
从这里面可以看出,

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

http://topic.csdn.net/t/20021112/10/1168603.html

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

转载于:https://www.cnblogs.com/starspace/archive/2009/01/14/1375477.html

最后

以上就是敏感大神为你收集整理的listen(int fd, int backlog)中的backlog含义的全部内容,希望文章能够帮你解决listen(int fd, int backlog)中的backlog含义所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部