【问题标题】:TCP socket to multiple IP/portTCP 套接字到多个 IP/端口
【发布时间】:2012-06-27 15:55:10
【问题描述】:

我正在尝试编写一个连接到多个 IP/端口的应用程序,我遇到的问题是我不知道 IP 的数量,因此一个部门可以使用它连接到 2 个 ip,而其他部门可能连接到8,所以它必须在运行时可配置,我正在考虑在循环中使用线程或fork,但不确定哪个更适合这项工作,希望有人可以在这里指导我,我在Linux下使用C .

例如 可以这样运行 a.out ip1 port1 ip2 port2 ip3 port3 另一个可以这样运行 a.out a.out ip1 port1

谢谢

【问题讨论】:

    标签: c multithreading network-programming fork


    【解决方案1】:

    我在这里看到了四种设计选择,每种都有优点和缺点。您的选择很大程度上取决于您的应用程序的具体用途。

    1. 1 进程/套接字(fork):这样做的好处是一个进程中的致命错误(例如 SEGFAULT)不会影响其他进程。缺点包括该方法更耗费资源并且流程更难以协调(例如,如果您想进行动态负载平衡)。

    2. 1 个线程/套接字 (pthreads):它的优点是非常轻巧,并且线程易于协调,因为它们共享一个公共内存空间。缺点包括一个线程中的错误可能会导致整个应用程序崩溃。

    3. 有限状态机:您可以在单个进程中使用单个线程,在所有套接字上执行巨大的poll,然后采取正确的(非阻塞)操作,即readwriteclose。我听说这在单处理器上非常快,但是,它没有利用多核架构,并且有点难以编程。

    4. 混合:选择以上三个中的任何一个并将它们组合起来。例如,参见Apache server

    【讨论】:

    • #2 有一个非常重要的含义——它使程序成为多线程的。这将带您进入充满竞争条件、数据损坏、锁定和死锁的激动人心的世界。必须考虑这一点。
    • 你的意思是因为 fd 将在线程之间共享,对吧?
    • @BagDev 没有。在这样的设计中,每个线程都有自己的 fd(在客户端连接时通过 accept() 线程与它通信)并独立运行。要解决死锁等问题,您必须专门编写一个代码。如果服务器只是对自己的客户端进行请求/响应,它就会变成一个阻塞的读/写循环。如果一个客户端-服务器线程希望与另一个 fd 通信(例如聊天),则很可能会出现问题。确实,一个线程中的严重错误(例如野指针)确实会导致整个应用程序崩溃,但您必须编写非常糟糕的代码才能做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多