2010-11-12 50 views

回答

4

只有accept()單個連接。

這裏是一個典型的服務器例行:

s = socket(...); 
bind(s, ...); 
listen(s, backlog); 
while (-1 != (t = accept(s, ...))) { 
    // t is a new peer, maybe you push it into an array 
    // or pass it off to some other part of the program 
} 

每完成accept()通話,返回一個新的連接的文件描述符。如果您只希望收到一個單個連接,則只需要accept()一次。想必你完成後該聽,因此,關閉您的服務器太:

s = socket(...); 
bind(s, ...); 
listen(s, backlog); 
t = accept(s, ...); 
close(s); 
// do stuff with t 

如果您希望只一次處理一個連接,並連接關閉後,恢復聽力,然後執行上面的accept()循環,並確實接受進一步的連接,直到t已關閉。

+0

感謝您的寶貴意見,其實我怎麼知道第一個連接是否已經關閉?因爲如果我的第一次連接是理想的一段時間?如果我收到一個新的連接,我必須在接受這個新連接之前檢查第一個連接是否處於活動狀態。我們有辦法實現這種情況嗎? – Thangaraj 2010-11-13 05:10:25

+0

當你從一個套接字讀取()時,它已經關閉,它將返回0.你也可以通過調用'close()'或'shutdown()'來自己關閉它。只要不滿意你已完成連接,就不要從你的函數處理't'中返回。請記住,一次處理多個連接是可能的,但我認爲處理單個連接就是你所追求的。 – 2010-11-13 08:57:25

+0

真的很棒的回答Matt Jonier,在這裏我們還有一個問題,假設讀/寫由其子進程處理,並且連接由其父進程處理。在這種情況下,如果我們使用read()檢查連接狀態來實際讀取一些數據,我們需要IPC將數據從父進程發送到子進程,這是不是開銷?我們是否也有解決方案?我有一個解決方案。我們可以使用getpeername()來檢查當前活動連接的狀態,是否會有任何副作用?我不確定這是否能解決問題?請分享您的想法。 – Thangaraj 2010-11-13 13:24:53

0

是否要拒絕所有連接或創建隊列? 我認爲你正在尋找的是所謂的「單身人士」。 看看單身設計模式的wikipadia。

+1

我不認爲他會找到C的Singleton模式;) – Prine 2010-11-12 12:40:52

0

更正看到下面:
您可以定義在 接受的請求量聽方法。

listen(socketDescription, numberOfConnectionsPending); 

第二個參數是設置掛起連接的數量,而不是連接本身的量..

如果設置了 numberOfConnections 1所有其他客戶端,它發送一個請求到服務器將收到一個 超時錯誤 ..

在這裏您可以找到更多的信息:http://shoe.bocks.com/net/#listen

我讀了聽錯文檔。你應該使用Matt的答案中描述的accept方法。

+0

如何警告用戶已經有其他連接處於活動狀態,並且此時不是由於網絡中斷? – Thangaraj 2010-11-12 12:50:16

+0

有沒有什麼方法可以檢查最後打開的套接字描述符是否處於活動狀態? – Thangaraj 2010-11-12 13:10:44

+1

我想你可以在accept方法中檢查這個。但我不確定.. accept()返回一個正整數,它是接受套接字的套接字描述符。如果發生錯誤,則返回-1,並將errno設置爲指示原因。檢查此網站:http://shoe.bocks.com/net/#accept – Prine 2010-11-12 13:57:54