【问题标题】:FTP server return code: How to connect with a host using my own TCP server and Linux built-in clientFTP 服务器返回码:如何使用我自己的 TCP 服务器和 Linux 内置客户端连接主机
【发布时间】:2015-04-22 22:31:37
【问题描述】:

在 Linux 中有一个内置的 ftp 服务器/客户端。如果您进入终端并键入“ftp localhost”(不带引号),则会立即连接到本地主机,FTP 服务器返回代码 220。然后您被要求输入主机名和密码 (331)。我正在尝试实现我自己的 FTP 服务器来做同样的事情。一旦客户端收到 localhost 和端口,它就必须询问主机名和密码,但是一旦我写下密码,我的程序就会挂起。这是我处理用户/密码问题的代码:

char login_user[BUFSIZ], login_password[BUFSIZ];
send(sock, "220\r\n", 5, 0); 
recv(sock, login_user, BUFSIZ);
send(sock, "331\r\n", 5, 0);
recv(sock, login_password, BUFSIZ, 0);
int x = strncmp(login_user, login_password, BUFSIZ);
if(x == 0)
{
    send(sock, "230\r\n", 5, 0);
} 

要使连接成功,主机名和密码必须相同。发送 FTP 服务器代码 230 应该像使用 FTP 内置服务器时一样建立连接。然而,我的程序只是停止并挂起,直到我按下 Ctrl+Z。我做错了什么?

【问题讨论】:

  • 你需要检查每个系统调用的结果是否为-1,如果你得到它调用perror()或打印一个由strerror()组成的错误,然后就好像它没有继续一样没有发生。对于recv(),您还需要检查它是否为零,这意味着对等方已断开连接,因此您必须这样做,而不是处理;否则结果是一个正数,表示传输了多少字节。你不能只假设这个值。
  • OT:“在 Linux 中有一个内置的 ftp 服务器/客户端。”不,没有。然而,某些 Linux 发行版恰好预装了任何 FTP 客户端和/或服务器工具。

标签: c linux sockets tcp ftp


【解决方案1】:

我认为这是因为 FTP 客户端没有收到 230 响应。

recv 命令不会神奇地等待客户端发送的“用户名”。它不知道您正在实现的协议中的一段数据(或行)是什么样的。所以它不知道它必须等待并停止在“新线路”上。您必须自己实现。

根据连接是否设置为阻塞,您拥有的代码可以:

  • recv 调用中根本不从套接字读取任何内容,从不进入if 块。
  • 可以在第一个 recv 调用中读取用户名和密码(客户端可能同时发送两者,可能在单个 TCP/IP 数据包中)。

在尝试实现像 FTP 服务器这样复杂的东西之前,您必须真正阅读大量有关套接字的知识。

【讨论】:

    【解决方案2】:

    login_user收到的不仅仅是名字,而是FTP access control commandUSER …\r\nlogin_password收到的不仅仅是密码,而是FTP访问控制命令PASS …\r\n;所以strncmp(login_user, login_password, BUFSIZ) 永远不会返回0(更何况字符串不是以'\0' 结尾的)并且永远不会发送230\r\n

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 2017-07-15
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2022-01-16
      • 2021-11-06
      • 2019-06-06
      • 1970-01-01
      相关资源
      最近更新 更多