如何将接受的套接字从父进程传递给子进程?

问题描述 投票:-1回答:1

我正在编写一个接受多个客户端连接并将其存储的python服务器。

如果我打印用于与一个已连接的客户端进行通信的正确连接的套接字,则会得到类似以下内容的输出:

<socket.socket fd=4, family=AddressFamily.AF_INET, type=2049, proto=0, laddr=('3.3.3.3', 1234), raddr=('4.4.4.4', 63402)>

出于隐私目的,我已用3.3.3.3替换了服务器的IP,并用4.4.4.4替换了客户端的IP。我真正的[[hoping可以正常工作,是将信息保存为以下格式的文件:

4 2049
然后子进程启动时,它将使用以下命令将此信息传递给套接字构造函数:

recovered_client = socket(AF_INET, 2049, 0, 4)

但是这不起作用。当我应用此过程并打印恢复的客户端时,会看到以下内容:

<socket.socket fd=4, family=AddressFamily.AF_INET, type=2049, proto=0>

似乎通过将文件描述符传递给构造函数,无法恢复原始连接中的字段

laddr

raddr我尝试通过将主机和端口从laddr和raddr添加到文件中,然后使用命令连接来手动修复此问题:

recovered_client.connect(('4.4.4.4', 63402))

但是这会产生错误:

OSError: [Errno 88] Socket operation on non-socket


作为实验,我在父进程中将连接保持打开状态,然后让子进程接受一个新的新连接并打印它,而我得到的是:

<socket.socket fd=4, family=AddressFamily.AF_INET, type=2049, proto=0, laddr=('3.3.3.3', 1234), raddr=('75.159.78.189', 49709)>

换句话说,已经使用不同的客户端端口建立了一个新连接,并具有相同的值[fd]。原始连接从未关闭,而是无限期挂起,因为按预期,父进程在调用子进程时冻结。

因此,这意味着我有两个不同的活动连接(尽管其中一个被冻结),它们的套接字具有相同的文件描述符。这是否意味着分配给套接字的字段[[fd

的值是相对于创建它的进程而言的?
如果是这样,我的方法显然是没有希望的。如何将在父进程中创建的客户端连接传递给子进程?

我正在编写一个python服务器,该服务器接受多个客户端的连接并将其存储。如果我打印正确连接的插座,该插座用于与已连接的客户端之一进行通信,则会得到...

如果是这样,我的方法显然是没有希望的。如何将在父进程中创建的客户端连接传递给子进程?
子级从其父级继承所有打开的文件描述符。无需“通过”任何东西。考虑以下代码:
#!/usr/bin/python import os import socket s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('localhost', 2049)) s.listen(5) def child_process(fd, addr): while True: data = fd.recv(10) if len(data) == 0: break print('read:', data) print('client {} has disconnected'.format(addr)) def main(): while True: c_fd, c_addr = s.accept() print('new connection from', c_addr) pid = os.fork() if pid > 0: # This is the parent process c_fd.close() else: # This is the child process child_process(c_fd, c_addr) return try: main() finally: s.close()

每个新连接都由子进程处理。在父级中打开了在父级中打开的文件描述符(例如accept调用返回的客户端套接字)。我们只需要确保在父级中关闭了客户端套接字,因为它已经被子级继承了。

python sockets subprocess
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.