【问题标题】:Fill C-Array with zeros, then copy data into it用零填充 C-Array,然后将数据复制到其中
【发布时间】:2014-03-25 00:36:47
【问题描述】:

这是使用套接字进行网络通信的 FTP 客户端应用程序的一部分。 在向 FTP 服务器发送命令之前,我想初始化命令缓冲区 归零 - 没有机会将新命令与任何可能出现的旧字符混合 在缓冲区的末尾(遵循新命令和'\0'

//global buffers msg[1024] and cmd[16]
void sendCommand(int client_socket, char* command, size_t cmd_len) {
    int in, out;
    memset(&msg, 0, sizeof(msg));
    memset(&cmd, 0, sizeof(cmd));
    strncpy(cmd, command, cmd_len); //
    printf("Command: %s\n", cmd);   //debugging prompt
    out = send(client_socket, cmd, sizeof(cmd), 0);
    sleep(1);
    in = recv(client_socket, msg, sizeof(msg), 0);
    sleep(1);
    printf("received %d bytes: %s\n", in, msg);  //debugging prompt
}

编辑:以下是上述函数的调用:

sendCommand(client_socket, "USER anonymous\r\n", sizeof("USER anonymous\r\n"));

问题是:缓冲区真的变空了,然后被命令填满了 但服务器无法识别某些命令(例如 PASV)。问题出在 代码,因为如果我尝试注释掉 memset(&cmd, 0, sizeof(cmd)); 我会得到预期 当前命令的结果加上错误 500 缓冲区尾部的未知命令cmd

这是来自服务器的示例答案:

Command: USER anonymous
received 720 bytes: 331 Please specify the password.
Command: PASS dummy    
received 720 bytes: 230-FFFFF III TTTTTT  Welcome!
230 Login successful.
500 Unknown command.    //tail of old data
command: PASV    
received 94 bytes: 227 Entering Passive Mode (147,229,9,30,40,184).
500 Unknown command.    //tail of old data
500 Unknown command.    //tail of old data
command: QUIT    
received 14 bytes: 221 Goodbye.

提前致谢!

【问题讨论】:

  • cmd_len 传递给函数时如何计算?
  • 我不认为需要 either 那些memset 操作。你应该确切地知道你的命令有多少字节并发送它,而不是一些固定的内存块,只有前面的命令。 IE。我不明白为什么你不只是发送commandcmd_len 作为块大小。并且接收方不应该使用超出实际接收的任何东西(你知道那是什么:in)。
  • 为什么不发送cmd_len字节而不是sizeof(cmd)
  • strncpy(cmd, command, cmd_len); 是......不够出色。如果调用者知道可以安全复制的命令长度,它可以只传递一个具有正确长度的字符串。如果它不知道,你为什么相信它?发明了strncpy,以便您将目标缓冲区的大小传递给它。不是源字符串的大小!至少可以说,后者毫无意义。
  • sizeof("USER anonymous\r\n") > 16.

标签: c memcpy memset strncpy


【解决方案1】:

错误是字符串长度不正确。 1) 字符串末尾不需要NULL。 2) 唯一正确的行尾是 FTP 的 CRLF 3) 现在我使用strlen 而不是sizeof

【讨论】:

    【解决方案2】:

    您是否将 /r 放在命令的末尾?并确保在 strncpy cmd_len 中包含 /r 的长度

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多