我想通过管道将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]