0

使用退出后,我似乎无法重新使用 Net::FTP 对象。

这是预期的吗?我无法从文档(cpan)中分辨出来。

作为一种解决方法,每次我需要执行一批 ftp 操作时,我都会创建一个新的 Net::FTP 对象。这似乎很浪费。

以下示例显示:初始登录成功,打印根目录 ls,退出(套接字关闭),登录失败并显示 ftp 消息“连接已关闭”。

#!/usr/bin/env perl

use strict;
use warnings;

use Net::FTP;

my $hostname = 'foo';
my $username = 'bar';
my $password = 'baz';

# successful first pass
my $ftp = Net::FTP->new( $hostname ) or die "cannot connect to $hostname: $@";
$ftp->login( $username, $password ) or die "cannot login: ", $ftp->message;
map { print "ls_output: $_\n" } $ftp->ls; # success
$ftp->quit or die "cannot close connection: ", $ftp->message;

# re-use attempt
$ftp->login( $username, $password ) or die "cannot login: ", $ftp->message;

# never gets here since re-use attempt fails
print "done!\n";
4

3 回答 3

2

quit导致远程端关闭连接,并且在不关闭连接的情况下无法注销。如果您试图避免重新连接,则不能。

另一方面,也许您希望login将您连接到服务器。连接是在 中创建的new,而不是在 中创建的login,并且 Net::FTP 不提供重新连接的方法。

Net::FTP 是 IO::Socket::INET 的子类,因此您可以使用 IO::Socket::INET's 重新连接connect,但您还必须重新初始化构造函数通常初始化的一个或两个字段。不过没什么复杂的。

但是,是否还有需要解决的问题?您谈到效率低下,但与建立 FTP 连接所需的时间相比,创建和初始化对象所需的时间相形见绌。

于 2012-09-27T18:23:36.873 回答
0

这不是 Perl 问题。这是FTP协议。发出后quit……就是这样,FTP会话结束。没有什么可以发出login命令了——没有人再听了。

使用 FTP 客户端在命令行上自己尝试一下。

于 2012-09-27T18:21:16.500 回答
0

从您链接的这个文档中:

辞职 ()

向远程 FTP 服务器发送 QUIT 命令并关闭套接字连接。

关闭套接字连接会终止与服务器的连接,而不仅仅是该服务器上的会话。

为每个连接创建一个新对象有两个缺点:

  1. Perl 可能会也可能不会将旧对象的数据保存在内存中——但垃圾收集不应该打扰您。

  2. 创建新连接需要一些开销。但除非您每秒创建数十个新连接,否则这不会打扰您。

所以每次都创建新对象;如果您愿意,可以重复使用相同的变量。在 Perl 中考虑得太低,过早优化只会造成伤害。

于 2012-09-27T18:24:00.963 回答