这是使用套接字进行网络通信的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.
提前致谢!
答案 0 :(得分:0)
你把/ r放在命令的最后?并确保在strncpy中cmd_len将包含长度为
的/ r答案 1 :(得分:0)
错误是字符串长度不正确。
1)字符串末尾不需要NULL
。
2)唯一正确的行尾是FTP的CRLF
3)现在我使用strlen
代替sizeof