我想要一個服務器程序,它應該只接受最多一個連接,並且應該放棄其他連接。我怎樣才能做到這一點?如何限制客戶端服務器程序中的連接數
0
A
回答
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
是否要拒絕所有連接或創建隊列? 我認爲你正在尋找的是所謂的「單身人士」。 看看單身設計模式的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方法。
相關問題
- 1. 客戶端連接或服務器端?
- 2. Twisted:到TCP服務器的客戶端連接數有限?
- 3. 如何強制HTTP2客戶端重新連接到服務器?
- 4. 客戶端應用程序與服務器的連接
- 5. 客戶端 - 服務器UDP連接
- 6. Oracle客戶端服務器連接
- 7. MySQL連接服務器客戶端
- 8. 如何遠程連接python tcp客戶端和服務器?
- 9. 修復:C++服務器/客戶端程序:「連接被拒絕」
- 10. 多客戶端連接時C#服務器程序掛起
- 11. 服務器端客戶端程序C
- 12. 如何將客戶端數據附加到服務器連接?
- 13. 如何在服務器端捕獲客戶端的連接和斷開連接?
- 14. C++ winsock服務器端客戶端遠程連接
- 15. Web服務客戶端中止連接
- 16. 服務器 - 客戶端應用程序中的套接字連接狀態
- 17. 如何在.net應用程序中設置Redis的客戶端連接限制?
- 18. 在客戶端服務器應用程序中動態選擇連接端口
- 19. 服務器/客戶端服務器連接
- 20. 哪個Web應用程序框架強制每個客戶端/服務器兩個HTTP的TCP連接限制?
- 21. 您如何知道客戶端何時連接到服務器?
- 22. 將qt客戶端應用程序連接到服務器上的數據庫
- 23. Java服務器,客戶端程序
- 24. 客戶端/服務器應用程序
- 25. RMI客戶端和服務器程序
- 26. 客戶端 - 服務器應用程序
- 27. 服務器客戶端應用程序
- 28. 簡單客戶端服務器程序
- 29. TCP/UDP客戶端/服務器程序
- 30. c程序客戶端服務器
感謝您的寶貴意見,其實我怎麼知道第一個連接是否已經關閉?因爲如果我的第一次連接是理想的一段時間?如果我收到一個新的連接,我必須在接受這個新連接之前檢查第一個連接是否處於活動狀態。我們有辦法實現這種情況嗎? – Thangaraj 2010-11-13 05:10:25
當你從一個套接字讀取()時,它已經關閉,它將返回0.你也可以通過調用'close()'或'shutdown()'來自己關閉它。只要不滿意你已完成連接,就不要從你的函數處理't'中返回。請記住,一次處理多個連接是可能的,但我認爲處理單個連接就是你所追求的。 – 2010-11-13 08:57:25
真的很棒的回答Matt Jonier,在這裏我們還有一個問題,假設讀/寫由其子進程處理,並且連接由其父進程處理。在這種情況下,如果我們使用read()檢查連接狀態來實際讀取一些數據,我們需要IPC將數據從父進程發送到子進程,這是不是開銷?我們是否也有解決方案?我有一個解決方案。我們可以使用getpeername()來檢查當前活動連接的狀態,是否會有任何副作用?我不確定這是否能解決問題?請分享您的想法。 – Thangaraj 2010-11-13 13:24:53