2012-06-27 125 views
0

我想寫一個連接到多個IP /端口的應用程序,我遇到的問題是IP數量對我而言是未知的,因此一個部門可以使用它連接到2 ips和其他部門可能連接到8,所以它必須在運行時配置,我想在循環內使用線程或叉,但不知道哪一個更好的工作,希望有人可以指導我在這裏,我在Linux下使用C語言。TCP套接字到多個IP /端口

例如 一個可以像這樣運行它a.out的IP1端口1 IP2端口2 IP3端口3 另可這樣的a.out a.out的IP1端口1運行

感謝

回答

3

我見這裏有四種設計選擇,每種都有優點和缺點。您的選擇很大程度上取決於您的應用程序的具體功能。

  1. 1處理/插座(叉):這具有的優點是,在一個處理(例如,段錯誤)一個致命的錯誤不會影響其他進程。缺點包括這種方法更耗資源,流程更難協調(例如,如果您想進行動態負載平衡)。

  2. 1螺紋/插座(並行線程):這具有的優點是它是非常輕和線程是容易協調,因爲它們共享一個公共的存儲器空間。缺點包括一個線程中的錯誤可能會導致整個應用程序停止運行。

  3. 有限狀態機:你可以在一個單一的過程中,不會在所有插座一個巨大的poll使用一個線程,然後採取正確的(非阻塞)動作,即readwriteclose。我聽說在單個處理器上這個速度非常快,但是,它沒有利用多核架構,編程起來也更難。

  4. 混合:挑選上述三者中的任意一種並將它們組合。例如參見Apache server

+0

#2有一個非常重要的含義 - 它使程序是多線程的。這讓你進入激烈的競爭環境,數據破壞,鎖定和死鎖。這必須考慮。 – ugoren

+0

你的意思是因爲fd會在這些線程中共享,對嗎? –

+0

@ BagDev no。在這樣的設計中,每個線程都有自己的fd,(在客戶端連接時通過accept()線程傳遞給它)並獨立運行。爲了解決死鎖等問題,你必須專門編寫一個。如果服務器只是用自己的客戶端請求/響應,它將成爲一個阻塞的讀/寫循環。如果一個客戶端 - 服務器線程希望與另一個fd進行通信(例如,聊天),則可能會出現問題。確實,一個線程中的嚴重錯誤(例如野指針)確實可能會導致整個應用程序崩潰,但您必須編寫非常糟糕的代碼才能完成此操作。 –