2012-06-27 126 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进行通信(例如,聊天),则可能会出现问题。确实,一个线程中的严重错误(例如野指针)确实可能会导致整个应用程序崩溃,但您必须编写非常糟糕的代码才能完成此操作。 –