Python连接套接字到进程
我有一个用C编写的(非常)简单的web服务器,我想测试它。我写它是为了让它在stdin上获取数据并在stdout上发送。如何将套接字(使用socket.accept()创建)的输入/输出连接到使用subprocess.Popen创建的进程的输入/输出 听起来很简单,对吧?杀手来了:我在运行Windows 有人能帮忙吗 以下是我尝试过的:Python连接套接字到进程,python,windows,sockets,process,Python,Windows,Sockets,Process,我有一个用C编写的(非常)简单的web服务器,我想测试它。我写它是为了让它在stdin上获取数据并在stdout上发送。如何将套接字(使用socket.accept()创建)的输入/输出连接到使用subprocess.Popen创建的进程的输入/输出 听起来很简单,对吧?杀手来了:我在运行Windows 有人能帮忙吗 以下是我尝试过的: 将客户端对象本身作为stdin/out传递给subprocess.Popen。(尝试从来都不痛。) 将socket.makefile()结果作为stdin/ou
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', PORT))
sock.listen(5)
cli, addr = sock.accept()
p = subprocess.Popen([PROG])
#I want to connect 'p' to the 'cli' socket so whatever it sends on stdout
#goes to the client and whatever the client sends goes to its stdin.
#I've tried:
p = subprocess.Popen([PROG], stdin = cli.makefile("r"), stdout = cli.makefile("w"))
p = subprocess.Popen([PROG], stdin = cli, stdout = cli)
p = subprocess.Popen([PROG], stdin = os.fdopen(cli.fileno(), "r"), stdout = os.fdopen(cli.fileno(), "w"))
#but all of them give me either "Bad file descriptor" or "The handle is invalid".
我也遇到了同样的问题,并尝试了同样的方法来绑定套接字,同样是在windows上。我提出的解决方案是共享套接字,并在进程中将其绑定到
stdin
和stdout
。我的解决方案完全使用python,但我想它们很容易转换
import socket, subprocess
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', PORT))
sock.listen(5)
cli, addr = sock.accept()
process = subprocess.Popen([PROG], stdin=subprocess.PIPE)
process.stdin.write(cli.share(process.pid))
process.stdin.flush()
# you can now use `cli` as client normally
在另一个过程中:
import sys, os, socket
sock = socket.fromshare(os.read(sys.stdin.fileno(), 372))
sys.stdin = sock.makefile("r")
sys.stdout = sock.makefile("w")
# stdin and stdout now write to `sock`
372
是测量的套接字的len
。share
调用。我不知道这是否是常数,但它对我有效。这只有在windows中才可能,因为share
函数仅在该操作系统上可用。请阅读。我也有同样的问题,但我提出的解决方案是共享套接字,将套接字的端口写入进程的stdin,或使用socket.share
函数(在python中)。我认为你至少应该考虑一下这个解决办法。它看起来不像是share()
和fromshare()
函数的C等价物,所以我不会接受这一点,因为从技术上讲,它不能回答这个问题。但这是非常有用的。谢谢。这是一个windows api调用,它有一个等价的调用,但在windows api中,您可以在此处阅读: