2012-12-21 197 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)