Python连接套接字进行处理

时间:2016-10-16 16:46:46

标签: python windows sockets process

我有一个(非常)我用C编写的简单Web服务器,我想测试它。我写了它所以它需要stdin上的数据并发送到stdout。如何将socket(使用socket.accept()创建)的输入/输出连接到使用subprocess.Popen创建的进程的输入/输出?

听起来很简单吧?这是杀手:我正在运行Windows。

有人可以帮忙吗?

这是我尝试过的:

  1. 将客户端对象本身作为stdin / out传递给subprocess.Popen。 (尝试它永远不会伤害。)
  2. 将socket.makefile()作为stdin / out传递给subprocess.Popen。
  3. 将套接字的文件号传递给os.fdopen()。
  4. 此外,如果问题不清楚,这里是我的代码的精简版:

    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".
    

1 个答案:

答案 0 :(得分:1)

我有同样的问题并尝试以相同的方式绑定套接字,也在Windows上。我提出的解决方案是共享套接字并将其绑定到流程stdinstdout。我的解决方案完全是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`

372len次调用的socket.share。我不知道这是不变的,但它对我有用。这仅适用于Windows,因为share功能仅适用于该操作系统。