【发布时间】: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 客户端和/或服务器工具。