我正在尝试使用以下代码实现ftp服务器:
64 if (command_sock == -1){
65 printf("error accepting socket connection: errno = %d\n", errno);}
66 else{printf("connection accepted\n");}
67
68 send(command_sock, "220 FTP Server ready\n", 25, 0);
69
70 int image_mode = 0; //not set to "I"
71 int file_str = 1; //file mode by default
72
73 while(1){
74 recv(command_sock, buffer, 512, 0);
75 sscanf(buffer, "%s %[^\n]s", command, arg);
76 printf("command = \"%s\"\n", command);
77 printf("arg = %s\n", arg);
78
79
80 if(strcmp(command, "USER") == 0){
81 send(command_sock, "230 user logged in\n", 35, 0);
82 }
83 else if(strcmp(command, "QUIT") == 0){
84
85 close(command_sock);
86 close(send_1);
87 goto listen;
88
89
90 }
但是当我尝试登录时它失败了,因为第81行真的发送了“%s 230用户登录\ n”。
root@nodeforcetwo:/home/rustyventure/opsys/mac_5# ftp
ftp> open 127.0.0.1 3500
Connected to 127.0.0.1.
220 FTP Server ready
Name (127.0.0.1:rustyventure): rusty
%s 230 user logged in
Login Failed
任何人都能明白为什么,我在这里不知所措。
由于
答案 0 :(得分:1)
在第68行中,您发送25个字节,但您要发送的字符串仅包含21个字节。在该字符串常量之后,您最终会发送额外的4个字节的内存。
答案 1 :(得分:0)
"220 FTP Server ready\n"
是21个字节,而不是25个,但FTP中的行终止符是\r\n
,而不是\n
,所以它应该是:
send(sock, "220 FTP Server ready\r\n", 22, 0);
你也犯了忽略recv()
返回的计数的常见错误。它可以是: