Передайте Unix Socket на случайный TCP-сокет, используя Python и, возможно, 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 read (0, 0x1e97a90, 8192): конечная точка транспорта не подключена
Примечание № 1: Я принимаю любое другое решение, кроме socat
Примечание № 2: Этот сценарий должен направлять веб-сервер, прослушивающий сокет Unix, и веб-браузер, подключающийся к сгенерированному порту TCP.
заранее спасибо
3 ответа
Я придумал более простой способ, вот он:
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]
Попробуйте socket.getsockname(), чтобы получить номер порта, вот так (пробовал в iPython):
In [7]: tcp_socket.getsockname()[1]
Out[7]: 41605
Попробуйте заменить UNIX-CONNECT
с UNIX-LISTEN
, С помощью CONNECT вы пытаетесь подключиться к существующему сокету; что это не так, это вина. Если я понимаю, что вы хотите, вы хотите, чтобы этот код создал новый сокет UNIX.
Изменить:
cmd = 'socat - UNIX-CONENCT:%s' % unix_sock_file
Для того, чтобы:
cmd = 'socat - UNIX-LISTEN:%s' % unix_sock_file