c - 用零填充 C-Array,然后将数据复制到其中

标签 c memcpy memset strncpy

这是使用套接字进行网络通信的 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, "用户匿名\r\n", sizeof("用户匿名\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.

提前致谢!

最佳答案

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

关于c - 用零填充 C-Array,然后将数据复制到其中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21969294/

相关文章:

在带有 return + C 的方法中正确使用 free()

c++ - memcpy_s C++ 指针

c++ - 既然已经有了 memset 等,为什么还存在 ZeroMemory 等?

c - 使用 memset 和 memcpy 的问题

mysql - C Realloc 追加字符串 MySQL 连接器

c - 以通用方式安全地初始化 C 中的数组

c - x86 gcc 程序集输出帮助请

c - fgets() 不会将文件内容读取到二维数组

c - 如何去掉字符串中的空格?

c++ - 数组分配后跟 memcpy 或 vector with reserve?