Передайте 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
Другие вопросы по тегам