Заполните C-Array нулями, затем скопируйте в него данные
Это часть клиентского приложения 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 ответа
Ошибка была неверной длины строки.
1) нет NULL
в конце строки необходимо.
2) Единственный правильный конец строки - CRLF для FTP. 3) Теперь я использую strlen
вместо sizeof
Вы ставите /r в конце своей команды? и убедитесь, что в strncpy cmd_len будет включать /r в длину