0

我想通过管道将 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 read(0, 0x1e97a90, 8192):传输端点未连接

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

提前致谢

4

3 回答 3

0

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

In [7]: tcp_socket.getsockname()[1]
Out[7]: 41605
于 2012-09-11T13:20:01.370 回答
0

尝试替换UNIX-CONNECTUNIX-LISTEN. 使用 CONNECT,您正在尝试连接到存在的套接字;这不是它的故障。如果我理解你想要什么,你希望这段代码创建一个新的 UNIX 套接字。

改变:

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

到:

cmd = 'socat - UNIX-LISTEN:%s' % unix_sock_file
于 2012-09-11T13:54:13.400 回答
0

我想出了一个更简单的方法,这里是:

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]
于 2012-09-11T15:43:17.627 回答