我有10.000個小設備,並且有一個服務器端口(等待連接)。我想用一臺服務器(PC)同時連接所有設備。我可以爲每個設備打開端口嗎? Windows有可能嗎? thnx從單個客戶端連接到多個服務器
回答
閱讀關於this page的第4.8節。原則上看起來答案是肯定的,但是您需要執行異步IO,因爲您無法同時在Windows上運行10000個線程。
*不真實*。它當然可以在Windows上運行10000個線程,請參見[千線程和阻塞I/O,幻燈片25](http://www.mailinator.com/tymaPaulMultithreaded.pdf)和[Windows的最大線程數是2000過程?](http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx),但你不應該這樣做,只是因爲你可以。 – jfs
謝謝Jan de Vaan和J.F. Sebastian。我真的想使用同步IO。因爲每個數據包和時間都很重要。我將把所有的消息直接放到數據庫中。我的意思是Thread可以在不同的進程中運行。如果我可以運行8個進程,並且可以開始工作(如每個進程1250個線程)。你怎麼看?我知道10.000線程不是推薦的,但它也是PC的問題?或任何優惠。 – yasin
J.F.提供的第二個鏈接引用:「每個客戶端的」一個線程「模型是衆所周知的,不會超過十幾個客戶端。」 – 2011-10-17 20:41:04
只要您使用了相當有效的輪詢策略(例如,I/O完成端口,如果您使用的是Windows)並且保持內核套接字緩衝區相當小,原則上可以。但是,如果可靠性不是一個大問題,並且您可以控制協議的兩端(即您正在設計設備),那麼UDP會更有效率 - 使用UDP,您可以使用單個套接字從所有設備讀取UDP。
如果TCP是一項要求,那麼您將擁有來自單個接口的60,000個連接的絕對限制,因爲TCP端口號只有16位,即64k個可能值。最終你會用盡本地端口號碼,除非你做了一些奇特的事情,例如給你的網絡接口提供多個IP地址。
實際執行此操作的方法是讓設備偵聽特定的多播組。這樣你就可以廣播一個數據包,聽這個組的機器將(很可能)接收數據包。
這也給了使用多播地址將事物劃分爲組的許多好處。
請注意,有可能丟失數據包 - 所以如果每條消息都很重要,我建議使用順序編號/恢復方法。
- 1. 連接到多個服務器的C#單個客戶端
- 2. 從單個客戶端套接字連接到多個服務器C
- 3. 如何將多個客戶端連接到單臺服務器?
- 4. 如何從一個服務器連接多個客戶端
- 5. 簡單的Java客戶端 - 服務器:客戶端doent連接到服務器
- 6. 將多個客戶端連接到一臺服務器
- 7. 將客戶端連接到Java中的多個服務器
- 8. 連接到同一臺服務器的多個tcpip客戶端?
- 9. 如何將多個客戶端連接到服務器
- 10. cometd客戶端連接到多個服務器
- 11. 連接到多個客戶端的服務器
- 12. Tcpclient多個客戶端連接到服務器
- 13. 讓多個客戶端連接到Java服務器
- 14. 連接多個客戶端到服務器
- 15. Socket.io-客戶端連接到多個服務器
- 16. 將服務器連接到多個客戶端
- 17. 單服務器與多個客戶端
- 18. 如何在C#中將多個客戶端連接到單個服務器
- 19. java客戶端web服務器連接到多個web服務器
- 20. 服務器到多個客戶端
- 21. udp - 客戶端到多個服務器
- 22. 連接到服務器http客戶端
- 23. C服務器連接到客戶端
- 24. 在服務器上接受客戶端的多個連接
- 25. 連接多個客戶端的異步套接字服務器
- 26. 將多個客戶端連接到後端服務器的單個HTTP持久連接
- 27. 通過單一連接將數千個客戶端連接到Jabber服務器
- 28. 單WCF服務於多個客戶端連接
- 29. 客戶端連接或服務器端?
- 30. 處理多個客戶端連接的Perl TCP服務器
設備如何連接? – BigMike
如果每個設備都有「服務器」端口等待連接,並且您嘗試從另一臺計算機連接到該設備,那麼PC不是客戶端嗎? –
[可能有500,000個連接](http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/) – jfs