在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内置服务器时那样 Build 连接 . 但是我的程序停止并挂起,直到我按下Ctrl Z.我做错了什么?
2 回答
我假设这是因为FTP客户端没有收到
230
响应 .recv
命令不会神奇地等待客户端发送的"username" . 它不知道您正在实现的协议中的数据(或行)是什么样的 . 所以它不知道它必须等待并停在"new line"上 . 你必须自己实现它 .根据连接是否设置为阻止,您拥有的代码可以是:
根本没有从套接字中读取任何内容,在
recv
调用中,从不进入if
块 .可以在第一个
recv
调用中读取用户名和密码(客户端可能同时发送两个,可能在单个TCP / IP数据包中) .在努力实现像FTP服务器一样复杂的东西之前,你必须真正阅读很多关于套接字的内容 .
你在
login_user
收到的不只是名字,而是FTP access control commandUSER …\r\n
,你在login_password
收到的不只是密码,而是FTP访问控制命令PASS …\r\n
;所以strncmp(login_user, login_password, BUFSIZ)
永远不会返回0
(因为字符串不是'\0' -terminated,所以也是如此),230\r\n
永远不会被发送 .