我有以下子程序:
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中)。
答案 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)