建站學院(LieHuo.Net)文檔 backlog應該是未完成3次握手連接和已完成3次握手而未被accept的兩對列之和.不知道我說的對不?如果要控制連接數(shù)量,是不是要自己編碼控制...下面的可以。
以下為引用的內容: 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 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)的第二個參數(shù)不起作用嗎?
《TCP/IP詳解 卷1:協(xié)議》的Page195有詳細解釋。
1)backlog 用于在TCP層接收鏈接的緩沖池的最大個數(shù),這個個數(shù)可在應用層中的listen函數(shù)里設置,當客戶鏈接請求大于這個個數(shù)(緩沖池滿),其它的未進入鏈接緩沖池的客戶端在tcp層上tcp模塊會自動重新鏈接,直到超時(大約57秒后)
2)我們的應用層的鏈接完成是要從tcp層的鏈接緩沖池中移出一個(accept函數(shù)實現(xiàn))
backlog是連接請求隊列的最大長度。
1.在WinSock1.1中最大值5。如果backlog小于1,則backlog被置喂1;若backlog大于SOMAXCONN(定義在winsock.h中,值為5),則backlog被置為SOMAXCONN。
2.在WinSock2中,沒有制定具體值,它由服務提供者決定
3.有時候backlog設置很小,這時我們接進多少臺機器都沒問題是因為服務器機器處理速度很快隊列來不及填滿就處理完了,而且在同一個時刻到來的連接還是很少的。