2011-10-14 152 views
2

我有10.000個小設備,並且有一個服務器端口(等待連接)。我想用一臺服務器(PC)同時連接所有設備。我可以爲每個設備打開端口嗎? Windows有可能嗎? thnx從單個客戶端連接到多個服務器

+0

設備如何連接? – BigMike

+0

如果每個設備都有「服務器」端口等待連接,並且您嘗試從另一臺計算機連接到該設備,那麼PC不是客戶端嗎? –

+0

[可能有500,000個連接](http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/) – jfs

回答

1

閱讀關於this page的第4.8節。原則上看起來答案是肯定的,但是您需要執行異步IO,因爲您無法同時在Windows上運行10000個線程。

+0

*不真實*。它當然可以在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

+0

謝謝Jan de Vaan和J.F. Sebastian。我真的想使用同步IO。因爲每個數據包和時間都很重要。我將把所有的消息直接放到數據庫中。我的意思是Thread可以在不同的進程中運行。如果我可以運行8個進程,並且可以開始工作(如每個進程1250個線程)。你怎麼看?我知道10.000線程不是推薦的,但它也是PC的問題?或任何優惠。 – yasin

+0

J.F.提供的第二個鏈接引用:「每個客戶端的」一個線程「模型是衆所周知的,不會超過十幾個客戶端。」 – 2011-10-17 20:41:04

0

只要您使用了相當有效的輪詢策略(例如,I/O完成端口,如果您使用的是Windows)並且保持內核套接字緩衝區相當小,原則上可以。但是,如果可靠性不是一個大問題,並且您可以控制協議的兩端(即您正在設計設備),那麼UDP會更有效率 - 使用UDP,您可以使用單個套接字從所有設備讀取UDP。

如果TCP是一項要求,那麼您將擁有來自單個接口的60,000個連接的絕對限制,因爲TCP端口號只有16位,即64k個可能值。最終你會用盡本地端口號碼,除非你做了一些奇特的事情,例如給你的網絡接口提供多個IP地址。

+0

[64k連接神話](http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/#the_64k_connection_myth)。 – jfs

+0

謝謝 - 今天我學到了一些東西! – uscjeremy

0

實際執行此操作的方法是讓設備偵聽特定的多播組。這樣你就可以廣播一個數據包,聽這個組的機器將(很可能)接收數據包。

這也給了使用多播地址將事物劃分爲組的許多好處。

請注意,有可能丟失數據包 - 所以如果每條消息都很重要,我建議使用順序編號/恢復方法。

相關問題