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밖에 안될 수 있다는 것이다.
그렇다면 다음 글에서 수정된 소스코드를 봐보자.
'시작하지 말았어야 했던 것 > (Unix, Linux) C Socket' 카테고리의 다른 글
(리눅스) echo 클라이언트 이외의 경우, 어플리케이션 프로토콜의 정의 (0) | 2021.02.03 |
---|---|
(리눅스) echo 클라이언트 수정된 코드 (0) | 2021.02.03 |
(리눅스) echo 클라이언트의 문제점 (0) | 2021.02.03 |
(리눅스) Iterative 에코 클라이언트 (0) | 2021.02.03 |
(리눅스) Iterative 에코 서버 (0) | 2021.02.03 |