gpt4 book ai didi

c - FTP服务器返回码: How to connect with a host using my own TCP server and Linux built-in client

转载 作者:行者123 更新时间:2023-11-30 17:20:16 25 4
gpt4 key购买 nike

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

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。我做错了什么?

最佳答案

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

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

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

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

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

关于c - FTP服务器返回码: How to connect with a host using my own TCP server and Linux built-in client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28642645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com