listen(int fd, int backlog)中的backlog含义
1. listen(int fd, int backlog)中的backlog不能限制連接數(shù)量???
http://bbs.chinaunix.net/viewthread.php?tid=870564
backlog應(yīng)該是未完成3次握手連接和已完成3次握手而未被accept的兩對(duì)列之和.不知道我說(shuō)的對(duì)不?
如果要控制連接數(shù)量,是不是要自己編碼控制...下面的可以嗎
while(1)
{
? ???while( connNumber <= 10 )//maxconn = 10;
? ???{
? ?? ?? ???accept();
? ?? ?? ???pthread_creat();
? ?? ?? ???connNumber++;
? ???}
}
thread()
{
??close(fd);
??connNumber--;
}
2. Linux Kernel 2.6,listen(5),永不 accept,到底能建立成功多少個(gè)連接?
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 -l3. ?關(guān)于listen(int sockfd, int backlog)backlog的意思(誠(chéng)心求教)
http://linux.chinaunix.net/bbs/viewthread.php?tid=1042212
listen(int sockfd, int backlog);
我在書(shū)上看到在unix編程中backlog這個(gè)表示:當(dāng)有多個(gè)客戶(hù)端程序和服務(wù)端相連時(shí),使用backlog這個(gè)表示可以接受的排隊(duì)長(zhǎng)度。
但是我在書(shū)上看到這個(gè)值一般設(shè)為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.
?
整個(gè)過(guò)程是這樣的:
在server端維護(hù)了兩個(gè)隊(duì)列,一個(gè)是完整隊(duì)列,在這個(gè)隊(duì)列中的描述符都是完成了三次握手的,一個(gè)是未完整隊(duì)列,在這個(gè)隊(duì)列中的描述符還沒(méi)有接收到客戶(hù)端最后的那個(gè)ACK。
而我認(rèn)為在Linux中這個(gè)backlog指的就是那個(gè)完整隊(duì)列的長(zhǎng)度(實(shí)際上按照UNP的說(shuō)法,這個(gè)backlog一直以來(lái)都存在混淆),所以說(shuō)雖然這個(gè)隊(duì)列只能擁有不到20個(gè)連接的處理能力,但是對(duì)于還沒(méi)有處理的連接,會(huì)存放到未完整隊(duì)列中的。當(dāng)完整隊(duì)列中的描述符被accept取走之后就可以移到完整隊(duì)列中來(lái)了。
你可以看看這個(gè)貼子,里面的實(shí)驗(yàn)可以說(shuō)明:
http://bbs.chinaunix.net/viewthread.php?tid=1259656&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1
從這里面可以看出,
4. windows 2k 里的listen(SOCKET s,int backlog)的第二個(gè)參數(shù)不起作用嗎?
http://topic.csdn.net/t/20021112/10/1168603.html
《TCP/IP詳解 ? 卷1:協(xié)議》的Page195有詳細(xì)解釋。 ?
? 1)backlog ? 用于在TCP層接收鏈接的緩沖池的最大個(gè)數(shù),這個(gè)個(gè)數(shù)可在應(yīng)用層中的listen函數(shù)里設(shè)置,當(dāng)客戶(hù)鏈接請(qǐng)求大于這個(gè)個(gè)數(shù)(緩沖池滿(mǎn)),其它的未進(jìn)入鏈接緩沖池的客戶(hù)端在tcp層上tcp模塊會(huì)自動(dòng)重新鏈接,直到超時(shí)(大約57秒后) ?
? 2)我們的應(yīng)用層的鏈接完成是要從tcp層的鏈接緩沖池中移出一個(gè)(accept函數(shù)實(shí)現(xiàn))
backlog是連接請(qǐng)求隊(duì)列的最大長(zhǎng)度。 ?
? 1.在WinSock1.1中最大值5。如果backlog小于1,則backlog被置喂1;若backlog大于SOMAXCONN(定義在winsock.h中,值為5),則backlog被置為SOMAXCONN。 ?
? 2.在WinSock2中,沒(méi)有制定具體值,它由服務(wù)提供者決定 ?
? 3.有時(shí)候backlog設(shè)置很小,這時(shí)我們接進(jìn)多少臺(tái)機(jī)器都沒(méi)問(wèn)題是因?yàn)榉?wù)器機(jī)器處理速度很快隊(duì)列來(lái)不及填滿(mǎn)就處理完了,而且在同一個(gè)時(shí)刻到來(lái)的連接還是很少的
轉(zhuǎn)載于:https://www.cnblogs.com/starspace/archive/2009/01/14/1375477.html
總結(jié)
以上是生活随笔為你收集整理的listen(int fd, int backlog)中的backlog含义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java中的动态绑定与静态绑定
- 下一篇: [重庆邮电大学俱乐部] 成都普创技术总监