socket send()使用前导"%s"回复

时间:2014-12-10 05:34:09

标签: sockets ftp send

我正在尝试使用以下代码实现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

任何人都能明白为什么,我在这里不知所措。

由于

2 个答案:

答案 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()返回的计数的常见错误。它可以是:

  • -1,表示错误
  • 0,表示流结束:对等已断开连接
  • > 0,表示实际传输的字节数。