2012-12-21 117 views
0

插座使用Perl中,我有以下子程序:翻譯到Python

use Socket 
... 
sub proxy_connect { 
    my $iaddr = Socket::inet_aton($proxy); 
    my $paddr = Socket::sockaddr_in(81, $iaddr); 
    my $proto = getprotobyname('tcp'); 
    my $fh = new FileHandle; 

    socket($fh, PF_INET, SOCK_STREAM, $proto) or return; 


    connect($fh, $paddr) or return; 
    $fh->autoflush(1); 
    # return a pointer to file handle 
    return \$fh; 
} 
my $mysock = proxy_connect(); 

Python的方法是完全不同的,而不是返回一個文件對象我返回一個插座,但我不知道的功能完全一樣:

import socket 
    ... 
    def proxy_connect(): 
    """ 
    Connect to the proxy and return a filehandle for it. 
    """ 
    proxy = "proxy.mydomain.com" 
    address = socket.gethostbyname(proxy) 
    con = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM) 
    con.connect((address, 81)) 
    return con 

我在正確的路徑翻譯這tunnel-ssh-over-http? 請注意,我在Perl中是新手,這只是一個練習,用來學習更多關於Perl和套接字(Python)的東西。

+0

'我的$跳頻=新的文件句柄;'應該是'我的$跳頻;'。再想一想,也許前者在12年前的5.6之前是需要的。 – ikegami

回答

1

是的,你可以做一個簡單的轉換。 select()將在Python中表現相同,允許您測試套接字上的數據就緒讀取。在Perl中,他們使用vec(),但在Python中測試您的套接字是否在select()的返回值中。在Perl中,它們是sysread/syswrite,而不是使用socket.recv()socket.send()

do_copy例程幾乎是一個直接轉換,除了socket.send()不帶偏移量/ len,所以如果socket.send()不指示整個緩衝區已發送,您將需要自己分割緩衝區。

SELECT循環將以與perl代碼中相同的方式工作。你會傳遞你想測試可讀性插座,並做類似:

readable, writeable, exceptional = 
     select.select([socket1, socket2], 
        None, [socket1, socket2]) 
if socket1 in readable: 
    do_copy(socket1, socket2) 
if socket2 in readable: 
    do_copy(socket2, socket1)