echo 클라이언트의 문제점
앞에서 봤던 echo_client.c의 코드를 다시 한번 봐보자.
-
-
위 사진에서 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 서버, 클라이언트는 정상적으로 작동한다.
하지만 이것은 실제 실행환경이 하나의 컴퓨터 또는 같은 네트워크에 접속되어 있는
두 대의 컴퓨터이다 보니 오류가 발생하지 않는 것 일뿐
오류 발생 확률이 없지는 않다.
-
이해가 되지 않는다면 다음 포스팅을 보고 이해해보자.
'시작하지 말았어야 했던 것 > (Unix, Linux) C Socket' 카테고리의 다른 글
(리눅스) echo 클라이언트 수정된 코드 (0) | 2021.02.03 |
---|---|
(리눅스) echo 클라이언트 완벽하게 구현하기 (0) | 2021.02.03 |
(리눅스) Iterative 에코 클라이언트 (0) | 2021.02.03 |
(리눅스) Iterative 에코 서버 (0) | 2021.02.03 |
(리눅스) Iterative 기반의 서버, 클라이언트 구현 과정 (0) | 2021.02.03 |