2012-08-07 77 views
0

我需要一些指針(工作的例子將是美好的)在以下問題。我是套接字編程的新手,雖然不是.net,但不介意在VB或c#中有任何幫助。TCPListener多個端口

我有一個「客戶」系統,它會吐出數據的常規塊(其實際上是ASCII)每幾個(讓說,10)秒。數據的尺寸很小,可能小於1K,我可以讓每個輸出按特定順序分隔(如<EoM>)。這個「客戶端」將輸出到多個(多於1個,少於5個)不同的端口。

我需要編寫一個服務器,它將打開所需數量的端口,監聽它們以獲取數據。當一個消息到達其中一個端口時,最後使用<EoM>定界符,我希望能夠獲取該數據,然後對其進行處理(解析並輸入數據庫以獲取信息)。並繼續聆聽下一條數據到達。這需要對所有定義的端口進行。如果客戶端應該斷開連接,我希望端口能夠等待並監聽重新連接,然後像以前一樣繼續處理。但作爲一個單一的客戶端將進行通信,我假設如果1端口斷開連接,可以重新啓動服務器進程,如果這比斷開連接後再聽更容易。

很抱歉的長期並不十分確切的問題,就像我說的,是新的Socket編程,所以如何做到這一點任何實際的例子,將不勝感激。最終的結果理想情況下是一個Windows服務,但是我希望將它作爲一個表單應用程序啓動,直到我將它全部用於調試。

乾杯任何幫助。

+1

你要求的不是你想要的。所有的客戶端都應該連接到同一個服務器端口,如果發生斷開,客戶端應該重新連接。應該不需要重新啓動任何進程 - 這對服務進程來說會有些不便:) – 2012-08-07 10:55:32

+0

TCP/IP不處理消息,只是一個字節流。期望從任意點點滴滴中重新組合你的「大塊數據」。 [This](http://stackoverflow.com/questions/11804131/asynchronous-tcp-socket-bytes-merging/11804312#11804312)可能會有所幫助。 – HABO 2012-08-07 10:59:42

+0

通常,應用程序在端口上偵聽連接請求。收到請求後,會打開另一個端口與新客戶端通信。原始端口可以繼續偵聽其他連接請求。根據您的應用程序,您可能想要監聽單個端口號並接受客戶端的多個連接。連接後每個客戶端都可以識別自己。您的應用程序將管理與您所期望的設置有關的重複或丟失客戶端的任何問題。 – HABO 2012-08-07 11:06:55

回答

0

一個TCPListener同時偵聽只有一個端口。如果您想在多個端口上偵聽,則需要創建TCPListener的許多實例。

既然你希望每個端口上監聽到執行不同的操作,您將需要接受每個端口上的客戶端,並處理您收到有數據。

上面的鏈接提供了一個基本的初學者示例如何接受客戶端和偵聽數據。雖然異步方法執行得更好,但此同步代碼更簡單,並且可以讓您輕鬆啓動。

0

你可以使用TAP/TUN的驅動程序來安裝自己的網絡接口(Windows和Linux),讓您可以訪問到原始的以太網幀。通過這種方式,您可以對幀進行自己的過濾,找到相關的IP和端口,並轉發到您自己的TCP/IP軟件堆棧進行維護。

雖然這會工作,也有缺點:

  1. TAP/TUN司機往往是低級別的數據包的10Mbps的
  2. 用戶模式處理是CPU密集型和包有時丟棄
  3. 說完就構建或使用TCP/IP庫將幀消解到TCP協議中,包括維護TCP會話狀態。

TAP/TUN非常適合安全篩選,也可能是UDP專長,但TCP/IP是另一個級別。

雖然這是一個可行的答案,我會推薦@ nunespascal的答案。異步編程並不困難,如果你只是在談論5個合理的聽衆。即使是數百個休眠的異步收聽者也應該是合理的。