2012-08-04 20 views
0

我創建了一個具有創建tcp套接字或udp套接字的方法的服務器和客戶端類的應用程序。現在我的要求是我創建了這個應用程序的兩個應用程序實例。由於應用程序是在Unix環境中的C++,我使用膩子軟件來運行應用程序。我打開了兩個膩子的例子。但現在我的要求如下:在C++的套接字編程中創建許多通信實例linux

可以有2個應用程序實例之間的多個通信實例

  • 每個通信情況下,可以有2個應用程序實例之間的多個通信實例

  • 每個通信實例可以是UDP或TCP(由配置文件確定)可以是UDP或TCP(由配置確定)fil

任何知道如何創建這種多個實例的人。

+0

自從應用程序讀取配置文件以來,還有一件事是因爲從此應用程序的單個實例創建的多個實例可以同時創建服務器和客戶端。 – user1575601 2012-08-04 04:58:00

+1

我不明白你想要什麼,你有2個應用程序正在運行,你想在它們之間進行通信?那就是你想要的?是在同一臺機器上還是在不同的機器上的兩個實例? – TOC 2012-08-04 05:43:57

回答

0

嗯,所以有兩個進程,但他們希望進程能夠通過多個套接字對彼此進行通信?即兩個進程之間可以有兩個(或更多)TCP套接字連接,和/或兩個(或更多)UDP套接字來回發送數據包。

如果我上面的段落是正確的(即,如果我沒有誤解請求),這當然是可能的,儘管通過這樣做你會獲得什麼好處並不十分明顯。然而,你需要做的是讓你的應用程序的每個實例創建多個套接字(通過套接字()+ bind()爲UDP套接字,或通過套接字()+ bind()+ listen()+接受)接受傳入的TCP連接,或通過socket()+ connect()啓動到其他程序實例的TCP連接。通常可以使用默認的阻塞I/O語義,這樣你最終可以像對待一個文件一樣處理套接字,並且讓每個send()或recv()操作(等)都花費很長時間在它返回到您的通話功能之前完成。

另一方面,如果您使用多個插座, lly希望能夠響應任何已準備就緒的套接字上的數據,這意味着你不能阻止在任何一個特定套接字上等待,因爲如果你這樣做了,你可能最終會等待很長時間(可能永遠!)在阻塞調用返回之前,並在此期間,您無法處理任何其他套接字進入的任何數據。 (問題變得特別明顯,當其中一個連接是一臺計算機的插頭被拔出時,因爲它通常需要TCP堆棧幾分鐘才能確定遠程計算機已經消失)

要處理問題,您通常要使用非阻塞I/O和套接字多路複用調用(例如poll()或select()或kqueue()),或者產生多個線程並讓每個線程處理一個套接字。這兩種方法都不是特別簡單 - 套接字多路複用方法一旦掌握了它就可以很好地工作,但多路複用調用的語義有點複雜,需要一段時間才能完全理解它的工作原理。非阻塞I/O使事情進一步複雜化,因爲它意味着您的代碼必須正確處理部分讀取和寫入操作。多線程方法一開始似乎比較簡單,但如果你不太關心線程是什麼的話,它有自己的更大更細微的「陷阱」(競爭條件,死鎖),從長遠來看可能會導致很多痛苦做和如何。

ps由於您處於Unix環境,第三種可能的方法是fork()每個套接字的子進程。這與多線程方法類似,只是有點安全,因爲你的「線程」實際上是進程,每個線程都有自己獨立的內存空間,因此他們不太可能在工作中彼此絆倒。缺點是內存使用率較高,並且由於進程空間分離導致進程彼此進行通信變得更加困難(並且更慢)。

+0

謝謝..很好的解釋..我已經實現了這個使用多線程..也會嘗試我的手在其他方法也。 – user1575601 2012-08-18 14:24:55