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

时间:2012-08-10 17:45:31

标签: c sockets

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

我正在考虑以下两种方式之一:

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

    所以序列将是:

    主进程为工作者A提供令牌。工作者A接受连接,将令牌返回给主进程。主进程为工作者B等提供令牌

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

有更好的想法吗?

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

3 个答案:

答案 0 :(得分:1)

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

/* 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;

如果您发现带有进程的解决方案很慢,则可以使用threads(它们共享相同的内存),但代码可能会增加复杂性并且跟踪错误可能很难。

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

答案 1 :(得分:1)

1)我不确定为什么你不想要多个“线程”而不是“进程”。

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

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

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

4)就“同步”而言 - 简单。工作人员只是阻止读取Unix套接字,直到有一个新的文件描述符开始使用它。

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

以下是使用“Unix域套接字”的讨论:

Stevens“网络编程”也是一个很好的资源:

答案 2 :(得分:0)

只是我最终使用的更新(3):当连接进来时,所有进程都被唤醒。在接受连接之前,他们尝试锁定共享的互斥锁。首先锁定互斥锁的那个接受连接。

这比来回传递令牌要快得多。

全部谢谢!