【问题标题】:Getting Connection refused in a FTP client socket program在 FTP 客户端套接字程序中获取连接被拒绝
【发布时间】:2021-05-20 17:39:55
【问题描述】:

我有这个 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();

【问题讨论】:

    标签: perl sockets ftp


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不看是什么意思?我在控制台上得到服务器输出。
    • 您的代码无条件地将所有命令发送到服务器,然后将套接字上收到的所有内容转储到控制台,直到连接关闭。您的代码不会以任何方式解析响应。这不是处理 FTP 的方法。
    • 您必须连接,然后 READ+PARSE THE GREETING,然后发送 USER 和 READ+PARSE 它的回复,然后发送 PASS 和 READ+PARSE 它的回复,只有当 USER 要求 @ 987654328@ 等,直到您到达 LIST。发送LIST 并读取+解析它的回复,然后建立第二个连接并从那个套接字读取列表直到完成,然后关闭第二个套接字并在第一个套接字上读取+解析它的最终回复。然后在关闭第一个套接字之前发送QUIT 和 READ+PARSE 它的回复。
    • Read the RFC,这个都有详细介绍。
    • 好的,我开始明白了。我要阅读文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多