반응형

echo 클라이언트의 문제점

 

 

앞에서 봤던 echo_client.c의 코드를 다시 한번 봐보자.

 

-

 

echo_client.c
0.00MB

 

 

 

-

 

위 사진에서 46 ~ 49 행에 삽입된 입출력 문장을 보면

 

-

 

write(sock, message, strlen(message));

str_len = read(sock, message, BUF_SIZE-1);

message[str_len] = 0;

printf("Message from server : %s", message);

 

-

 

위의 코드는 다음과 같은 잘못된 가정이 존재한다.

 

"read, write 함수가 호출될 때마다 문자열 단위로 실제 입출력이 이뤄진다"

 

물론 write 함수를 호출할 때마다 하나의 문장을 전송하니

 

이렇게 가정하는 것도 이상한 것은 아니지만

 

TCP는 데이터의 경계가 존재하지 않는다고 했었다.

 

위에서 구현한 클라이언트 TCP 클라이언트이기 때문에

 

둘 이상의 write 함수호출로 전달된 문자열 정보 묶여서 한 번에 서버로 전송될 수 있다.

 

그리고 그러한 상황이 발생하면 클라이언트 한번에 둘 이상의 문자열 정보 서버로부터 되돌려 받아

 

원하는 결과를 얻지 못할 수 있다.

 

또한, 서버가 다음과 같이 판단할 수 있다.

 

-

 

"문자열의 길이가 꽤 긴 편이니, 문자열을 두 개의 패킷에 나눠서 보내야겠다"

 

서버는 한번의 write 함수 호출로데이터 전송을 명령했지만

 

전송할 데이터의 크기가 크다면

 

운영체제는 내부적으로 이를 여러 개의 조각으로 나눠 클라이언트에게 전송할 수도 있다.

 

그리고 이 과정에서 데이터의 모든 조각 클라이언트에게 전송되지 않았음에도 불구하고

 

클라이언트 read 함수를 호출할지도 모른다.

 

-

 

이 모든 문제가 TCP의 데이터 전송 특성에서 비롯된 것이다.

 

하지만 우리가 배운 echo 서버, 클라이언트 정상적으로 작동한다.

 

하지만 이것은 실제 실행환경이 하나의 컴퓨터 또는 같은 네트워크에 접속되어 있는 

 

두 대의 컴퓨터이다 보니 오류가 발생하지 않는 것 일뿐

 

오류 발생 확률이 없지는 않다.

 

-

 

이해가 되지 않는다면 다음 포스팅을 보고 이해해보자.

 

반응형

+ Recent posts