계산기 클라이언트
-
-
8행, 9행
피연산자의 바이트 수와 연산 결과의 바이트 수를 상수화했다.
-
15행
데이터의 송수신을 위한 메모리 공간은 이렇듯 배열을 기반으로 생성하는 것이 좋다.
데이터를 누적해서 송수신해야 하기 때문이다.
-
38행, 39행
프로그램 사용자로부터 피연산자의 개수 정보를 후 이를 배열 opmsg에 저장하고 있다.
char형으로의 형 변환은
"피연산자의 개수 정보를 1바이트 정수 형태로 전달한다"
라고 정의한 프로토콜에 근거한 형 변환이다.
그렇기에 1바이트로 표현 불가능한 범위의 정수가 입력되면 안 된다.
참고로 여기서는 부호 있는 정수의 형태로 예제를 작성했지만
피연산자의 개수 정보는 음수가 될 수 없으므로 부호 없는 양의 정수 형태로 예제를 작성하는 것이 보다 합리적이다.
-
41행, 45행
프로그램 사용자로부터 정수를 입력받아서배열 opmsg에 이어서 저장하고 있다.
char형 배열에 4바이트 int형 정수를 저장해야 하기 때문에 int형 포인터로 형 변환을 하고 있다.
만약에 이 부분이 이해되지 않는다면 포인터에 대한 별도의 학습이 필요한 상태이다.
-
47행
49행에서 문자를 입력받아야 하는데
이에 앞서 버퍼에 남아있는 \n 문자의 삭제를 위해 fgetc 함수가 호출된다.
-
49행
마지막으로 연산자 정보를 입력받아서배열 opmsg에 저장하고 있다.
-
50행
드디어 write 함수 호출을 통해 opmsg에 저장되어 있는 연산과 관련된 정보를 한 번에 전송하고 있다.
이렇듯 한 번의 write 함수 호출을 통해서 묶어서 보내도 되고
여러 번의 write 함수 호출을 통해서 나눠서 보내도 된다.
여러 차례 강조했듯이
TCP는 데이터의 경계가 존재하지 않기 때문이다.
-
51행
서버가 전송해주는 연산 결과의 저장과정을 보이고 있다.
수신한 데이터의 크기가 4바이트이기 때문에 이렇게 한 번의 read 함수 호출로 충분히 수신이 가능하다.
-
이로써 클라이언트에 대한 분석을 마쳤다.
마지막으로 클라이언트가 서버에 전송하는 데이터 구성의 예를 그림으로 정리해 보자.
-
-
이렇듯 하나의 배열에 다양한 종류의 데이터를 저장해서 전송하려면
char형 배열을 선언해야 한다.
뿐만 아니라
다소 과도한 포인터 및 배열 연산이 등장하기도 한다.
이제 다음 글에서 서버 프로그램의 코드를 봐보자.
'시작하지 말았어야 했던 것 > (Unix, Linux) C Socket' 카테고리의 다른 글
(리눅스) 계산기 서버 (0) | 2021.02.03 |
---|---|
(리눅스) 계산기 서버와 클라이언트의 예시 (0) | 2021.02.03 |
(리눅스) echo 클라이언트 이외의 경우, 어플리케이션 프로토콜의 정의 (0) | 2021.02.03 |
(리눅스) echo 클라이언트 수정된 코드 (0) | 2021.02.03 |
(리눅스) echo 클라이언트 완벽하게 구현하기 (0) | 2021.02.03 |