2012-10-15 25 views
8

我在Linux中編寫了兩對代碼(server.cclient.c)。一個用於UNIX域AF_UNIX其他用於INTERNET域AF_INET。兩者都正常工作!listen()隊列長度在套接字編程中c?

listen()爲緩衝區隊列長度稱爲= 3both servers

listen(sockfd, 3); 

在UNIX域(AF_UNIX):當一個客戶端與服務器連接時,如果我嘗試連接多個客戶機到服務器。三個排隊,第四個請求被拒絕。 (正如我所希望的那樣 - 3在等待隊列中)。

在INTERNET域(AF_INET):三個以上的請求被保存在未決隊列中。

即使積壓隊列長度爲3,爲什麼不是來自第四個客戶端的請求被拒絕?爲什麼listen()(和其他)協議的行爲依賴於?

+0

我真的不明白你的意圖......爲什麼你會因爲排隊滿了而拒絕客戶? –

+1

@ KarolyHorvath:我的意思是,如果我給予排隊長度等待,它應該被拒絕。我想知道這一點。 –

+0

@Grijesh Chauhan:理論上......是的...... *實際上* ..誰在乎?爲什麼這會打擾你? –

回答

9

操作系統實際上使用比指定爲listen()的傳入TCP連接更大的隊列。多大取決於操作系統。

listen(int socket_fd, int backlog) 

對於給定的監聽套接字維護兩個隊列。

  1. 一個不完整的連接隊列 - SYN已經到達,但三次握手(TCP)沒有完成。 (SYN_RCV狀態)
  2. 完整的連接隊列 - 完成三次握手。 (ESTABLISHED狀態)

積壓參數歷史地指定兩個隊列的總和。但是積壓的含義沒有正式的定義。

伯克利派生的實現爲積壓添加了一個模糊因素。所以總隊列length = factor * backlog

W. Richard Stevens在書中給出了非常詳細和深入的解釋。此外,可以在Stevens,Fenner,Rudoff的「Unix Network Programming: The Sockets Network API」,第1卷,第三版,第108頁中找到顯示七個操作系統的值的表格。

+1

例如在Linux 2.4上。7給'listen()'3的'backlog'導致最多6個連接排隊。 –

+1

在你的答案中編輯了一些更多細節。謝謝! –

+0

CentOS 6.6 2.6.32-504.el6.x86_64 積壓隊列是積壓參數+1 – adrianlzt

3

該平臺有權調整指定的積壓或向下,根據其最小值和默認值。現在,默認值更像是500而不是5,這是它在1983年左右開始的地方。你不能依賴它是你所指定的,並且沒有找到它真正是什麼的API,並且沒有明顯的希望它比默認值短的有效應用原因。