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