Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C 在多个进程之间协调共享侦听套接字的接受_C_Sockets - Fatal编程技术网

C 在多个进程之间协调共享侦听套接字的接受

C 在多个进程之间协调共享侦听套接字的接受,c,sockets,C,Sockets,协调多个进程之间侦听套接字的接受的最佳方法是什么 我在想两种方法之一: 有一个“主”进程,当轮到它开始接受连接时,它将向每个进程发送消息 因此,顺序将是: 主进程将令牌交给工作进程A。工作进程A接受连接,将令牌交还给主进程。主进程向工人B等提供令牌 每个进程都有一个接受线程,该线程将围绕一个共享互斥体旋转。锁定互斥锁,接受连接,释放锁 还有更好的主意吗 当连接进入所有进程时,所有进程都会被唤醒。在接受连接之前,他们会尝试锁定共享互斥锁。锁定互斥锁的人首先接受连接 我认为主解决方案也是一个不

协调多个进程之间侦听套接字的接受的最佳方法是什么

我在想两种方法之一:

  • 有一个“主”进程,当轮到它开始接受连接时,它将向每个进程发送消息

    因此,顺序将是:

    主进程将令牌交给工作进程A。工作进程A接受连接,将令牌交还给主进程。主进程向工人B等提供令牌

  • 每个进程都有一个接受线程,该线程将围绕一个共享互斥体旋转。锁定互斥锁,接受连接,释放锁

还有更好的主意吗

  • 当连接进入所有进程时,所有进程都会被唤醒。在接受连接之前,他们会尝试锁定共享互斥锁。锁定互斥锁的人首先接受连接

    • 我认为主解决方案也是一个不错的选择:

      /* Process struct */
      typedef struct _process_t {
          unsigned long process_id;
          struct _process_t *next;   /* next process */
          struct _process_t *prev;   /* previous process */
          struct _process_master *master_process;  /* Master process */
          int (*accepting_socket) (struct _process_t *); /* process accepet function */
          char *received_data_buffer;      /* the data received over the socket */
      } process_t;
      
      /* List of process */
      typedef struct _process_list {
          process_t *head;
          process_t *tail;
          int count;
      } process_list;
      
      /* The master process */
      typedef struct _process_master {
          process_list socket_listners;   /* All the process listening */
          process_list ready_listners;    /* Process ready to listen and receive*/
      
          ..... /* Complete this struct */
      } process_master;
      
      如果您发现进程的解决方案很慢,您可以使用
      线程
      (它们共享相同的内存),但是代码可能会增加复杂性,并且跟踪bug可能很困难

      第二种解决方案并不比第一种解决方案快,因为获取互斥的成本和在所有进程之间切换上下文的成本。

      1)我不确定为什么您不希望多个“线程”而不是“进程”

      但是如果您需要一个工作进程池(相对于“工作线程”),那么我建议:

      2) 主进程绑定、侦听。。。并接受所有传入连接

      3) 使用“Unix套接字”将接受的连接从主进程传递到工作进程

      4) 至于“同步”,很简单。worker只是阻止读取Unix套接字,直到有一个新的文件描述符供其开始使用

      5) 您可以为工作者设置共享内存块,以便将“忙/闲”状态传送给主机

      下面讨论如何使用“Unix域套接字”:

      Stevens的“网络编程”也是一个优秀的资源:


      我最后做了一个更新(3):当连接进入所有进程时,所有进程都会被唤醒。在接受连接之前,他们会尝试锁定共享互斥锁。锁定互斥锁的人首先接受连接

      它比来回传递令牌要快得多


      谢谢大家

      如果我是你,我会选择大师级的方法。谢谢你的建议。我目前已经实现了这个(主进程将消息作为令牌发送),但是我认为它太慢了。对于每个accept,我都会进行以下“额外”系统调用。工作者调用“send()”发回令牌。主休眠是“select()”调用“recv()”来获取令牌。然后调用“send()”将令牌发送给Worker B,并返回“select()”中的睡眠状态。工作者B调用“recv()”以接受令牌。所以我想可能太慢了…谢谢!关于互斥体获取和上下文切换;即使在主从式场景中,上下文切换也会发生。我只是在想,获取互斥可能比主-工作者场景中需要的所有系统调用都要快。谢谢你的建议!谢谢对于工作人员,我宁愿使用进程而不是线程。将套接字从一个进程发送到另一个进程的想法听起来确实很有趣。也就是说,让一个进程执行所有的接受操作,并将其发送给工作进程进行进一步处理。我会试一试的!谢谢