이것은 네트워크 통신을 위해 소켓을 사용하는 FTP 클라이언트 응용 프로그램의 일부입니다. FTP 서버에 명령을 전송하기 전에, 나는 제로에 명령 버퍼 를 초기화하지 싶어 -. 버퍼의 끝에 을 할 수있는 오래된 문자로 새 명령을 혼합 할 기회를 (새 명령 및 '\0'
다음0으로 C- 배열을 채운 다음 데이터를 복사하십시오.
//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).
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.
: 나는
memset(&cmd, 0, sizeof(cmd));
을 주석 처리하려고하면 내가 500 알 수없는 명령 버퍼의 꼬리 현재 명령 플러스 오류 결과를 예상 얻을 때문에 문제가 코드에
cmd
여기
서버에서 예를 들어 대답은
미리 감사드립니다.
의
strlen
를 사용하여 FTP 3)에 대한 CRLF입니까? – ouah나는'memset' 연산 중 * 어느 쪽이나 필요가 없습니다. 당신은 명령이 얼마나 많은 바이트인지를 정확히 알고 미리 보내야합니다. 정면에 명령 만있는 고정 된 메모리 덩어리가 아닙니다. 나는. 나는 당신이'cmd_len'을 가진'command'를 청크 크기로 보내지 않는 이유를 알지 못합니다. 그리고 수신 측은 실제로 수신 된 것을 넘어서서는 안됩니다. (그리고 당신은 그것이 무엇인지 알고 있습니다 : in). – WhozCraig
왜 'sizeof (cmd)'대신에'cmd_len' 바이트를 보내지 않으시겠습니까? – Kiwi