2010-05-02 45 views
3

我想確保我嘗試在插座上使用accept()的方式的正確性。用插座分叉

我知道在Linux下是安全的listen()一個插座上,fork()ñ孩子再recv()在所有的人都沒有從用戶側的任何同步數據包(數據包獲得更多或更少的負載平衡的子女之間) 。但是這是UDP。

TCP和listen()fork()accept()是否保留相同的屬性?我可以假設在父母創建的共享套接字上接受是可以的,即使其他孩子也一樣嗎? POSIX,BSD套接字或任何其他標準在某處定義它?

+0

看這裏... http://www.linuxhowtos.org/C_C++/socket.htm – 2010-05-03 00:53:26

回答

2

如果您在子項中使用fork()然後接受(),則只有一個子進程將在連接上調用accept(),然後對其進行處理。這是預分配,連接不會在兒童之間共享。

您可以通過顛倒訂單並接受和分叉來爲每個連接方案執行標準的一個孩子。然而,這兩種技術都是爲了效率,平衡等,而不是爲了共享特定的連接。

TCP與UDP不同。在TCP中這樣做是不可取的,因爲你幾乎肯定會陷入混亂。給定的收到消息可以分散在一個或多個數據包上,對於多個進程進行協調比讓一個孩子處理連接更麻煩。

+0

你的答案的第一段是我真正感興趣的。我可以安全地接受每個孩子的()(在父母套接字上)嗎?或者更準確地說,運行'while(1){accept();處理(); close();}'循環在每個孩子? – viraptor 2010-05-03 00:46:48

+0

@viraptor:是的,你可以。 – caf 2010-05-03 00:56:24

+0

@viraptor - 是的,就是這樣,除了殺死進程之外,還有一種擺脫循環的方式。 – Duck 2010-05-03 01:12:09