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()が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)
于 2012-12-21T17:41:18.283 に答える