2010-05-02 31 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