【问题标题】:Use a socket accepted by the parent process, in a child process created before accepting the socket在接受套接字之前创建的子进程中使用父进程接受的套接字
【发布时间】:2019-01-22 16:11:57
【问题描述】:

我正在使用“预分叉模型”和 C 语言编写一个跨平台、多进程和多线程的服务器。 根据模式(多进程或多线程),刚刚启动的服务器会创建一组进程/线程,其任务是处理主服务器接受的客户端请求。 因为子进程是在接受套接字之前创建的,所以它们显然不会继承接受的套接字。 在win32中我解决了,复制套接字。 我在 C linux 下怎么做?

【问题讨论】:

  • 我对这个问题有点困惑。您的代码是创建了许多线程还是创建了许多进程。?注意:由于代码可以创建一个“线程池”,因此使用多个线程会更容易。如果你的意思是codfe创建了多个进程,那么用于与客户端通信的socket在另一个进程中将是一个无意义的数字

标签: c linux sockets client-server preforking


【解决方案1】:

使用 Unix 域套接字而不是管道进行父子之间的任何控制通信。与管道不同,它们是双向的。如果使用数据报套接字,每个send() 对应一个recv(),反之亦然(即保留消息边界),这使得传递结构等更容易。

重点是,您可以使用 Unix 域套接字在进程之间传递描述符。 cmsg man page 有示例代码。

本质上,在你 fork 子进程之前,你会创建一个 Unix 域套接字对,对于每个子进程都是唯一的,用于控制父子进程之间的通信。我建议使用 Unix 域数据报套接字。

当父进程希望将连接移交给子进程时,它会向子进程发送一条消息,其中包含一个包含已连接套接字描述符的SCM_RIGHTS 辅助消息。 (内核将处理复制描述符的细节;请注意,描述符编号可能在接收过程中有所不同。)

这种方法不仅适用于 Linux,也适用于 BSD。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 2012-08-08
    • 2015-03-21
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多