반응형

echo 클라이언트 완벽하게 구현하기

 

 

앞서 배운 echo 클라이언트 문제점이 있는 클라이언트였다.

 

그리고 이 문제점 TCP 전송방식의 특성으로 인한 문제점이다.

 

이 문제점이 뭔지 모른다면 TCP 특성 echo 클라이언트를 다시 한번 복습해야 한다.

 

-

 

문제점은 echo 클라이언트에서만 존재한다.

 

echo 서버는 정상적인 서버이다.

 

그런데 코드를 놓고 비교하면 

 

이해되지 않을 수 있는 부분이 있다.

 

입출력에 사용된 함수의 호출문이 동일하다.

 

먼저 echo 서버의 입출력 문장이다.

 

(echo_server.c의 54 ~ 55 행이다.)

 

-

 

 

-

 

그리고 이어서 echo 클라이언트의 입출력 문장이다.

 

(echo_client.c의 46 ~ 47 행이다.)

 

-

 

 

-

 

둘 다 read 함수 write 함수 반복 호출하는데 차이가 없다.

 

실제로 앞서 보인 echo 클라이언트

 

자신이 서버로 전송한 데이터를 100% 수신한다.

 

다만 수신하는 단위에 문제가 있다.

 

클라이언트 코드를 좀 더 봐보자.

 

(echo_client.c의 38 ~ 50 행이다.)

 

-

 

 

-

 

echo 클라이언트 문자열을 전송한다.

 

그것도 write 함수 호출을 통해서 한 번에 걸쳐 전송한다.

 

(이것은 문제가 되지 않는다.)

 

그리고 read 함수호출을 통해서 자신이 전송한 문자열 데이터를 한번에 걸쳐 수신한다.

 

(바로 이것이 문제이다.)

 

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

 

즉, 위에서 write 함수 한 번 호출하여 문자열 데이터를 보내고

 

read 함수 한 번 호출하여 문자열 데이터를 수신하는데

 

이때 모든 문자열이 손실 없이 수신된다 라는 가정하에 한 번 호출하여 받는다.

 

결국엔 echo 클라이언트에게 문자열 데이터가 전부 재전송되니까

 

시간이 좀 지나서 read 함수를 호출하면 한 번에 걸쳐 문자열 데이터를 수신할 수 있다.

 

하지만 얼마나 기다려야 하는가

 

10분쯤 기다려서 수신한다면 이는 이치에 맞지 않는 클라이언트가 된다.

 

이치에 맞는 클라이언트라면

 

문자열 데이터가 전송되었을 때 이를 모두 읽어서 출력해야 한다.

 

-

 

echo 클라이언트 문제점을 정리하자면

 

echo 클라이언트 10byte의 문자열 데이터를 보냈고

 

echo 서버에서 5byte의 문자열 데이터를 받았는데

 

나머지 5byte의 문자열 데이터를 받기 전에 

 

클라이언트에서 read 함수를 호출해버리면 

 

echo 클라이언트한테는 5byte만 재전송된다.

 

즉, echo 클라이언트 10byte를 보냈는데 

 

다시 받은 데이터는 5byte밖에 안될 수 있다는 것이다.

 

그렇다면 다음 글에서 수정된 소스코드를 봐보자.

 

반응형

+ Recent posts