반응형
echo 클라이언트 수정된 코드
앞서 배운 echo 클라이언트의 문제점은
초보 프로그래머들도 흔히 실수하는 것 중 하나이다.
그런데
우리가 배웠던 echo 클라이언트의 경우에는 해결이 쉽다.
클라이언트가 수신해야 할 데이터의 크기를 미리 알고 있기 때문이다.
예를 들어서 크기가 100byte인 문자열을 전송했다면
다시 100byte가 수신될 때까지 반복해서 read 함수를 호출하면 된다.
-
-
위 코드 중 44 ~ 54 행까지가 변경 및 추가된 부분이다.
이전 코드에서는 단순히 read 함수를 한번 호출하고 말았던 것을
위 코드에서는 전송한 데이터의 크기만큼 데이터를 수신하기 위해서
read 함수를 반복 호출하고 있다.
따라서 정확히 전송한 바이트 크기만큼 데이터를 수신할 수 있게 되었다.
그리고
위 코드 중 47 행의 반복문은 다음과 같이 조건을 줘도 된다.
-
-
보낸 만큼 받아야 하므로
recv_len에 저장된 값과 str_len에 저장된 값이 일치하는 시점이 while문을 빠져나가는 시점이다.
그래서 위 반복문의 조건이 더 논리적이라는 생각이 들 수 있지만
위 반복문의 조건은 무한루프에 빠질 수 있는 조건이다.
혹시라도 오류가 발생해서 데이터를 읽는 과정에서 recv_len에 저장된 값이
str_len을 초과하는 상황이 발생한다고 가정하면
프로그램은 while문을 빠져나오지 못한다.
하지만 while문의 조건을 다음과 같이 주면 오류가 발생해도 무한루프에 빠지지 않는다.
-
반응형
'시작하지 말았어야 했던 것 > (Unix, Linux) C Socket' 카테고리의 다른 글
(리눅스) 계산기 서버와 클라이언트의 예시 (0) | 2021.02.03 |
---|---|
(리눅스) echo 클라이언트 이외의 경우, 어플리케이션 프로토콜의 정의 (0) | 2021.02.03 |
(리눅스) echo 클라이언트 완벽하게 구현하기 (0) | 2021.02.03 |
(리눅스) echo 클라이언트의 문제점 (0) | 2021.02.03 |
(리눅스) Iterative 에코 클라이언트 (0) | 2021.02.03 |