将Perl中的套接字使用转换为Python

时间:2012-12-21 16:56:14

标签: python perl sockets

我有以下子程序:

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中)。

1 个答案:

答案 0 :(得分:1)

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

do_copy例程几乎是直接转换,除了socket.send()不接受offset / 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)