首页 文章

FTP服务器返回码:如何使用我自己的TCP服务器和Linux内置客户端连接主机

提问于
浏览
0

在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 回答

  • 0

    我假设这是因为FTP客户端没有收到 230 响应 .

    recv 命令不会神奇地等待客户端发送的"username" . 它不知道您正在实现的协议中的数据(或行)是什么样的 . 所以它不知道它必须等待并停在"new line"上 . 你必须自己实现它 .

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

    • 根本没有从套接字中读取任何内容,在 recv 调用中,从不进入 if 块 .

    • 可以在第一个 recv 调用中读取用户名和密码(客户端可能同时发送两个,可能在单个TCP / IP数据包中) .

    在努力实现像FTP服务器一样复杂的东西之前,你必须真正阅读很多关于套接字的内容 .

  • 0

    你在 login_user 收到的不只是名字,而是FTP access control command USER …\r\n ,你在 login_password 收到的不只是密码,而是FTP访问控制命令 PASS …\r\n ;所以 strncmp(login_user, login_password, BUFSIZ) 永远不会返回 0 (因为字符串不是'\0' -terminated,所以也是如此), 230\r\n 永远不会被发送 .

相关问题