使用Python将Unix套接字管道连接到随机TCP套接字,可能是Socat



我想通过管道将TCP套接字连接到Unix套接字我可以用类似的socat来完成

socat TCP-LISTEN:1234 UNIX-CONNECT:test.socket

但这里的问题是,我不想自己指定端口号我希望操作系统为我选择一个免费端口,但我仍然可以知道端口。

我写了这个脚本,它不起作用,但可能说明我想做什么

def bind(unix_sock_file):
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_socket.bind(('', 0))
    tcp_socket.listen(1)
    cmd = 'socat - UNIX-CONNECT:%s' % unix_sock_file
    Popen(cmd, shell=True, stdin=tcp_socket, stdout=tcp_socket, close_fds=True)
    return tcp_socket.getsockname()

我得到的错误是:

2012/09/11 15:34:39 socat[26509]E读取(0,0x1e97a90,8192):传输端点未连接

注1:我也接受除socat之外的任何其他解决方案
注意#2:这个脚本应该通过管道传输一个在Unix套接字上侦听的Web服务器,以及一个连接到生成的TCP端口的Web浏览器

提前感谢

尝试socket.getsockname()获取端口号,如下所示(在iPython中尝试):

In [7]: tcp_socket.getsockname()[1]
Out[7]: 41605

尝试用UNIX-LISTEN替换UNIX-CONNECT。使用CONNECT,您正试图连接到一个存在的套接字;事实并非如此,所以它有错。如果我理解您想要什么,那么您希望此代码创建一个新的UNIX套接字。

更改:

cmd = 'socat - UNIX-CONENCT:%s' % unix_sock_file

收件人:

cmd = 'socat - UNIX-LISTEN:%s' % unix_sock_file

我找到了一个更简单的方法,它是:

def bind(unix_sock_file):
    CMD = "socat TCP-LISTEN:0 UNIX-CONNECT:%s" % unix_sock_file
    pid = Popen(CMD, shell=True, close_fds=True).pid
    return psutil.Process(pid).get_children()[0].get_connections()[0].local_address[1]

最新更新