gpt4 book ai didi

sockets - 有没有办法让多个进程共享一个监听套接字?

转载 作者:行者123 更新时间:2023-12-03 05:05:22 26 4
gpt4 key购买 nike

在套接字编程中,您创建一个监听套接字,然后对于每个连接的客户端,您将获得一个可用于处理客户端请求的普通流套接字。操作系统在后台管理传入连接的队列。

两个进程不能同时绑定(bind)到同一个端口 - 无论如何,默认情况下。

我想知道是否有一种方法(在任何众所周知的操作系统上,尤其是 Windows)来启动进程的多个实例,以便它们都绑定(bind)到套接字,从而有效地共享队列。每个流程实例都可以是单线程的;它只会在接受新连接时阻塞。当客户端连接时,空闲流程实例之一将接受该客户端。

这将允许每个进程有一个非常简单的单线程实现,除非通过显式共享内存,否则不共享任何内容,并且用户将能够通过启动更多实例来调整处理带宽。

有这样的功能吗?

编辑:对于那些询问“为什么不使用线程?”的人显然线程是一种选择。但是,对于单个进程中的多个线程,所有对象都是可共享的,并且必须非常小心地确保对象要么不共享,要么一次仅对一个线程可见,要么绝对不可变,并且大多数流行的语言和运行时缺乏管理这种复杂性的内置支持。

通过启动一些相同的工作进程,您将获得一个并发系统,其中默认是不共享的,从而更容易构建正确且可扩展的实现。

最佳答案

您可以在 Linux 甚至 Windows 中的两个(或多个)进程之间共享套接字。

在Linux(或POSIX类型操作系统)下,使用fork()将导致 fork 的子进程拥有所有父进程的文件描述符的副本。任何未关闭的套接字都将继续被共享,并且(例如使用 TCP 监听套接字)可用于为客户端 accept() 新套接字。这就是许多服务器(包括大多数情况下的 Apache)的工作方式。

在 Windows 上,基本上也是如此,只是没有 fork() 系统调用,因此父进程需要使用 CreateProcess 或其他方法来创建子进程进程(当然可以使用相同的可执行文件)并需要向其传递一个可继承的句柄。

将监听套接字设置为可继承句柄并不是一项完全微不足道的事件,但也不是太棘手。 DuplicateHandle() 需要用于创建一个重复句柄(但仍在父进程中),该句柄将设置可继承标志。然后,您可以将 STARTUPINFO 结构中的句柄作为 STDINOUTERR 提供给 CreateProcess 中的子进程> 句柄(假设您不想将其用于其他用途)。

编辑:

阅读 MDSN 库,发现 WSADuplicateSocket 是执行此操作的更稳健或更正确的机制;它仍然很重要,因为父/子进程需要计算出需要通过某种 IPC 机制复制哪个句柄(尽管这可能像文件系统中的文件一样简单)

澄清:

回答OP的原始问题,不,多个进程不能bind();只是原始父进程会调用 bind(), listen() 等,子进程只会通过 accept(), send()recv()

关于sockets - 有没有办法让多个进程共享一个监听套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/670891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com