0

TCPソケットをUnixソケットにパイプしたいので、このようにsocatを使用してこれを行うことができます

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

しかし、ここでの問題は、ポート番号を自分で指定したくないということです。OS に空いているポートを選択してもらいたいのですが、それでもポートを知ることができます。

私はこのスクリプトを書きましたが、それは機能しませんが、私がやりたいことを示しているかもしれません

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

私はそれへのより簡単な方法を考え出しました、ここにあります:

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 に答える
0

次のように、 socket.getsockname()を試してポート番号を取得します (iPython で試しました):

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

に置き換えUNIX-CONNECTてみてくださいUNIX-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 に答える