Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP套接字到多个IP/端口_C_Multithreading_Network Programming_Fork - Fatal编程技术网

TCP套接字到多个IP/端口

TCP套接字到多个IP/端口,c,multithreading,network-programming,fork,C,Multithreading,Network Programming,Fork,我正在尝试编写一个连接到多个IP/端口的应用程序,我遇到的问题是,我不知道IP的数量,因此一个部门可以使用它连接到2个IP,而另一个部门可以连接到8个,因此它必须在运行时进行配置,我正在考虑使用线程或fork-inside-loop,但不确定哪一个更适合这项工作,希望有人能在这里指导我,我在Linux下使用C 比如说 可以这样运行它。输出ip1端口1 ip2端口2 ip3端口3 另一个可以像这样运行a.out a.out ip1端口1 谢谢我在这里看到四种设计选择,每种都有优点和缺点。您的选择在

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

比如说 可以这样运行它。输出ip1端口1 ip2端口2 ip3端口3 另一个可以像这样运行a.out a.out ip1端口1


谢谢

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

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

  • 1thread/socket(pthreads):它的优点是非常轻巧,线程很容易协调,因为它们共享一个公共内存空间。缺点包括一个线程中的错误可能会导致整个应用程序崩溃

  • 有限状态机:您可以在单个进程中使用单个线程,对所有套接字执行一个巨大的
    轮询
    ,然后采取正确的(非阻塞)操作,即
    读取
    写入
    关闭
    。我听说这在单处理器上速度非常快,但是,它没有利用多核架构,编程比较困难

  • 混合:选择以上三种中的任何一种,并将它们组合在一起。请参见示例


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

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

  • 1thread/socket(pthreads):它的优点是非常轻巧,线程很容易协调,因为它们共享一个公共内存空间。缺点包括一个线程中的错误可能会导致整个应用程序崩溃

  • 有限状态机:您可以在单个进程中使用单个线程,对所有套接字执行一个巨大的
    轮询
    ,然后采取正确的(非阻塞)操作,即
    读取
    写入
    关闭
    。我听说这在单处理器上速度非常快,但是,它没有利用多核架构,编程比较困难

  • 混合:选择以上三种中的任何一种,并将它们组合在一起。请参见示例


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