在 FTP 客户端套接字程序中获取连接被拒绝

Getting Connection refused in a FTP client socket program

我有这个 Perl 脚本,我想在其中获取 FTP 服务器的列表。

我的理解是 FTP 服务器打开一个新的连接回到 客户端托管在某个随机端口上以发送数据。我应该以某种方式创建 一个新的套接字并从中读取?我不知道如何让它工作。

#!/usr/bin/perl

use warnings;
use 5.30.0;
use IO::Socket;

my $socket = IO::Socket::INET->new("core9:21"); 

$socket->send("USER user7\r\n", 0);
$socket->send("PASS s$cret\r\n", 0);
#$socket->send("SYST\r\n", 0);
#$socket->send("HELP\r\n", 0);
#$socket->send("TYPE A\r\n", 0);
$socket->send("PORT 192,168,0,20,200,95\r\n", 0);
$socket->send("LIST\r\n", 0);
$socket->send("QUIT\r\n", 0);

while (my $line = <$socket>) {
    print($line); 
}

$socket->close();

您正在使用 PORT 命令,该命令告诉 FTP 服务器与 指定的 IP:Port 建立新连接.所以是的,在服务器可以连接到它之前,你当然必须在 IP:Port 上实际创建你自己的第二个监听套接字。

否则,使用 PASV 命令代替(无论如何你应该这样做,因为它对 运行 在 NAT 路由器后面的客户端更友好),它告诉 FTP 服务器在其一侧打开一个监听端口,然后您可以将第二个插座连接到该端口。 FTP 服务器会告诉您 IP:Port 您需要连接到的位置。

此外,您的代码离成为有效的 FTP 客户端还很远,因为您没有阅读甚至查看服务器的响应来了解您的命令是成功还是失败。您甚至不需要阅读服务器的初始问候语就可以知道您是否被允许向它发送命令。

我强烈建议您阅读官方 FTP 协议规范,RFC 959