2014-02-23 4 views
1

이것은 네트워크 통신을 위해 소켓을 사용하는 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 여기

서버에서 예를 들어 대답은

미리 감사드립니다.

+0

strlen를 사용하여 FTP 3)에 대한 CRLF입니까? – ouah

+4

나는'memset' 연산 중 * 어느 쪽이나 필요가 없습니다. 당신은 명령이 얼마나 많은 바이트인지를 정확히 알고 미리 보내야합니다. 정면에 명령 만있는 고정 된 메모리 덩어리가 아닙니다. 나는. 나는 당신이'cmd_len'을 가진'command'를 청크 크기로 보내지 않는 이유를 알지 못합니다. 그리고 수신 측은 실제로 수신 된 것을 넘어서서는 안됩니다. (그리고 당신은 그것이 무엇인지 알고 있습니다 : in). – WhozCraig

+1

왜 'sizeof (cmd)'대신에'cmd_len' 바이트를 보내지 않으시겠습니까? – Kiwi

답변

0

명령 끝 부분에/r을 넣고 있습니까? strncpy cmd_len에 길이가/r을 포함하는지 확인하십시오.

0

오류 문자열 길이가 잘못되었습니다. 1) 문자열의 끝에 NULL이 필요하지 않습니다. 2) 라인의 유일한 올바른 말은 지금은 대신 sizeof 함수에 전달하면`cmd_len` 계산되는 방법