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

时间:2014-02-23 14:12:14

标签: 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, "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.

提前致谢!

2 个答案:

答案 0 :(得分:0)

你把/ r放在命令的最后?并确保在strncpy中cmd_len将包含长度为

的/ r

答案 1 :(得分:0)

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