2012-09-11 26 views
0

我要管一個TCP套接字Unix套接字 我可以做到這一點使用socat這樣管材的Unix套接字來使用Python隨機TCP套接字,並可能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年9月11日15時34分:39 socat [26509] E讀(0,0x1e97a90,8192):運輸 端點沒有連接

說明#1:我接受其他任何其他的解決方案,socat太
注意2:該腳本應該管道監聽Unix套接字的Web服務器,以及連接到生成的TCP端口的Web瀏覽器。

在此先感謝

+0

是否出錯了呢? – tMC

+0

是的,我在帖子末尾添加了錯誤信息。 – Radian

回答

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] 
0

嘗試socket.getsockname()獲得的端口號,像這樣(在IPython的嘗試):

In [7]: tcp_socket.getsockname()[1] 
Out[7]: 41605 
+0

謝謝你的回答,但這不是問題! – Radian

+0

啊,你已經把它包含在腳本中了。但是,您不必將端口包含在您的''socat''命令中,而不是將其返回到您的函數中嗎?如果你陳述了什麼問題:'但是這裏的問題,我不想自己指定端口號,我希望操作系統爲我選擇一個空閒端口,但我仍然可以知道端口。 – gertvdijk

+0

我的問題是在標題中提到的,「將Unix套接字管道連接到隨機的TCP端口」 問題是我想讓socat到一個隨機端口,並且我應該可以在以後知道端口 – Radian

0

嘗試用UNIX-LISTEN更換UNIX-CONNECT。使用CONNECT,您嘗試連接到存在的套接字;這並不是它的缺點。如果我明白你想要什麼,你希望這段代碼創建一個新的UNIX套接字。

變化:

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

要:

cmd = 'socat - UNIX-LISTEN:%s' % unix_sock_file 
+0

如果我的解釋不好,但是我的解決方案很糟糕,但是Unix套接字被創建並正在被網絡服務器。 我想讓這個腳本連接到這個套接字,然後聽一個TCP套接字。要啓用瀏覽器連接到Web服務器 – Radian

+0

@Radian oh ok - 那麼我認爲'傳輸端點未連接'意味着Web服務器沒有運行或其他關閉套接字;但沒有刪除套接字文件。 – tMC