2012-02-12 7 views
0

그래서, 난 그냥 클라이언트에서 메시지를 읽고는 "그래"C 서버 이상한 행동

while(strcmp(buffer, "QUIT") != 0){ 
    bzero(buffer, 255); //cleans the read buffer 

    /*this reads the aux (request) from the client*/ 
    recv(newsockfd, buffer, 255, 0); 

    if(strlen(buffer)) 
     printf("Thread %d: %s\n", thread_no, buffer); 
    fflush(stdout); 

    write(newsockfd, "yup\n", 4); 
} 

이 처음 읽는 모든 간다 문제가에 회신하는 코드의 조각을 가지고 좋아,하지만 다른 모든 수치가 엉망이되면, "기타"라는 메시지를 보내면 예를 들어, 'g', 루프를 얻은 다음 '기타'를 가져와 다른 "옙"을 보냅니다.

나는 무슨 일이 일어나는지 전혀 모른다.

+1

코드에서이 동작을 방지한다고 생각하십니까? –

답변

6

짧은 이야기 : TCP는 메시지 지향 프로토콜이 아니며 스트림 지향 프로토콜입니다. 메시지가 조각화되거나 병합 될 수 있으며 응용 프로그램이이를 처리해야합니다. 단 에 데이터를 수신한다는 보장 만 있습니다.

+0

또는 가능한 한 간단하게 말하면 필요한 의미 체계가있는 프로토콜을 설계하고 구현하는 것을 잊어 버렸습니다. –

0

recv()은 현재 가능한 많은 데이터를 읽습니다. EOF, 오류 또는 개행 문자가 나올 때까지 읽어야합니다. 해당 줄 바꿈이있는 경우에만 "QUIT"과 비교하고 "Yup"으로 확인하는 완전한 줄이 있습니다.

0

위 코드 스니 피트의 다른 세 가지 버그.

1) recv()의 반환 값을 확인하지 않습니다. 소켓은 정상적으로 닫혔거나 (반환 값 == 0), 에러가 발생했습니다 (반환 값 == -1) ... 더 중요한 것은 "QUIT"클래스의 모든 4 바이트를 수신 할 것을 제안하는 것이 아닙니다. 원격 송신 호출에 의해 송신 된 메시지. "Q"만받을 수 있습니다.

2) recv (255 문자 중 하나도 null 문자가 아님)를 수신하면 후속 strlen()이 유효하지 않은 메모리로 읽혀 충돌 할 수 있습니다.

3) 쓰기 호출의 반환 값을 확인하지 않습니다.