2011-05-18 27 views
1

我有一個應用程序需要與遠程計算機上的客戶端配對。可以在服務器上運行該應用程序的多個實例,每個實例服務於不同的客戶端,可能多達25-30對。如何在差異機器上與多個客戶端連接的服務器中管理應用程序的多個實例

每對服務器 - 客戶端都需要有兩個TCP連接。服務器應用程序有2個進程,每個進程都有自己的tcp連接到客戶端。

  • 工藝A的交流與客戶機命令
  • 方法B從客戶端接收恆定的視頻流。

另外,還有每對流程A /方法B之間的另一個TCP連接

命令/數據將從如下流動:

客戶< - >方法A < --->方法B

而視頻將在該方向上流動:

客戶端 - >處理B

我需要幫助來確定什麼是建立所有tcp連接的最佳方法。誰設置了聽衆?如何確定要使用的端口?等

我現在有過程的一個實例的既進程B和客戶溝通,但它是所有在一臺機器上運行,所以我只是用「localhost」作爲我的主機名了。我也對我使用的2個端口進行了硬編碼,因此當我有多個實例時,我需要更改它以便每個實例使用不同的端口。

一旦過程A使與客戶機連接時,它需要向客戶端對一個端口,以便方法B可以與客戶端直接進行其它連接。這是做這件事的好方法,還是更好的方法?客戶如何確定可用的端口?

還有任何幫助或指示如何分配的端口,所以這可以與多個實例工作,將不勝感激。

謝謝,請詢問什麼說不清楚的問題。

編輯:其實進程A和進程B是兩個不同的應用程序。

回答

0

我不知道有足夠的瞭解應用,所以有可能這可以進一步簡化,但我會做到以下幾點:

  • 創建一個或兩個服務器進程監聽已知端口(你可以可能會把它歸結爲一,但如果你需要兩個,好吧,我會解釋如何做到這一點)。

  • 如果你能得到它歸結爲一個單一的服務器進程,它可以監聽兩個端口本身。使用select調用,您可以讓它監視每個打開文件描述符上的活動。事實上,這就是爲什麼我認爲你可以用一個過程或者一小部分來完成整個過程。

  • 有客戶端連接到已知端口的服務器上。當你進入遠程網絡時,讓服務器連接到客戶端會給你帶來麻煩。您始終可以通過端口轉發或DMZ獲取服務器,但您不能堅持要求所有客戶端都更改其網絡以刪除NAT,禁用防火牆或轉發應用程序的端口。

  • 當客戶端連接,如果需要多個進程,使服務器建立分叉,這樣就可以使用已知的端口連接之前開放連接到對方。

  • 如果你需要一個單獨的進程,使用fork分裂過程。在子進程中,您關閉正在偵聽已知端口的文件描述符。在父進程中,除了連接到其他服務器進程的文件描述符外,還關閉連接到客戶端的文件描述符。

注意:這是來自Linux的背景,但我敢肯定,所有這些功能和方法將在Windows上工作。如果我錯了,我肯定有人會糾正我。我強烈建議嘗試使用select將這個過程簡化爲一個簡單的編碼過程。如果您需要更好地使用多處理器系統,那麼可以使用多線程或者擁有一組折中連接處理的進程。瞭解文件描述符如何在fork將簡化您的編碼後工作,您需要創建多個進程。

+0

感謝您的意見。實際上,流程A和B是兩個不同的應用程序,所以沒有父/子流程。沒有使用叉子。 – emge 2011-05-18 01:53:43

+0

你說「讓客戶端連接到服務器上的已知端口」當我有幾個運行的服務器應用程序的實例時,這將如何工作。每個實例都需要位於不同的端口上。 – emge 2011-05-18 01:55:24

+0

如果是兩個獨立的過程,你必須至少有兩個已知端口,PROC A和B.如果你不能得到PROC B到一個單一的過程,監聽和叉子掉孩子,然後爲每個PROC B,I」 d通過端口號找到處於A狀態的端口號。 proc A可以將此端口號發送給客戶端進行第二次連接。 – BMitch 2011-05-18 02:01:30