0

我有以下子程序:

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 的方法完全不同,我没有返回一个 File 对象,而是返回一个套接字,但我不确定功能是否完全相同:

  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 中)的东西。

4

1 回答 1

1

是的,您可以直接进行转换。select() 在 Python 中的行为相同,允许您测试套接字上的数据准备读取。在 Perl 中,他们使用 vec(),但在 Python 中,您测试您的套接字是否在 select() 的返回值中。在他们 sysread/syswrite 的 Perl 中,您将改为使用 socket.recv() socket.send()

do_copy 例程几乎是一个直接的转换,除了 socket.send() 不使用偏移量/长度,因此如果 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)
于 2012-12-21T17:41:18.283 回答