Python连接套接字到进程

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

我有一个用C编写的(非常)简单的web服务器,我想测试它。我写它是为了让它在stdin上获取数据并在stdout上发送。如何将套接字(使用socket.accept()创建)的输入/输出连接到使用subprocess.Popen创建的进程的输入/输出

听起来很简单,对吧?杀手来了:我在运行Windows

有人能帮忙吗

以下是我尝试过的:

  • 将客户端对象本身作为stdin/out传递给subprocess.Popen。(尝试从来都不痛。)
  • 将socket.makefile()结果作为stdin/out传递给subprocess.Popen
  • 将套接字的文件号传递给os.fdopen()
  • 此外,如果问题不清楚,下面是我的代码的精简版本:

    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中,您可以在此处阅读: