이번부터 지금까지 배운 TCP 소켓 함수들을 이용하여 TCP 서버-클라이언트 예제를 한번 구현해보겠음.
echo(메아리) 서버, 클라이언트를 한번 만들어보자.
main 함수의 for문 전까지는 그냥 소켓을 생성하고 바인딩한 후 listen 상태도 만드는 기본적인 소켓 셋팅 코드임.
그리고 for문에 들어오면 연결 소켓을 connfd에 저장하고 fork로 자식 프로세스를 생성한다.
fork 반환값이 0이면 자식프로세스 분기인데, 자식은 listen 소켓을 닫고 연결 소켓을 연다.
str_echo 라고 하는 아래 정의된 함수에 의해서 connfd 가 작업을 함.
원래는 여기 나오는게 concurrent server 즉, 동반 서버에 대한 설명을 했어야 했는데,
따로 빼서 하기도 애매해서 코드와 함께 작성할 참이다.
우리가 사용하는 네트워크 프로그램들은 전부 concurrent 서버이다.
무슨 말이냐면 하나의 서버가 여러 클라이언트를 처리할 때 fork로 자식프로세스를 생성하여
여러개의 클라이언트와의 작업을 수행할 수 있도록 하는 것을 말한다.
위 그림은 일단 서버가 accept 로 connected 소켓을 반환 받기 전이다.
connected가 되면 아래 그림과 같이 변한다.
connfd에 accept의 반환값이 저장되었다. 자 이제 연결이 된건데, 아까 뭐라했노 concurrent 서버가
되어야 한다고 말했다. 여러개의 클라이언트를 처리할 수 있는... 그래서 fork로 자식 프로세스를 생성한다.
부모와 자식프로세스는 파일 디스크립터를 공유한다
그래서 fork로 자식을 생성하면 부모와 같은 fd를 가르키고 있는 것이다.
자 그럼 이제 그 뒤에 어떻게 해야할까?
부모의 connected 소켓을 닫고, 자식의 listen 소켓을 닫는다.
자식은 더이상 listen 상태에 있을 필요가 없다. 현재 연결된 클라이언트만 처리하면 된다.
그리고 부모는 자식에게 클라이언트와의 연결을 넘겼으므로, 다른 연결 요청을 받기 위해 listen만 열어둔다.
이제 다시 코드로 돌아와보면 str_echo 함수 호출 전의
동작이 눈에 보일 것이다.
자식이면 listen소켓 close, 부모면 connected 소켓 close.
그다음 str_echo 함수에 대해 함봅시다.
이 소스 코드가 TCP echo 서버라고 말했었다. echo가 뭔가. 메아리란 뜻이다.
표준 입력에서 문자열을 읽어서 서버로 보내고, 서버가 다시 돌려주는 echo를 표준출력에서 보여주는것이다.
1. readline 함수로 소켓에서 데이터를 읽어 line 문자열에 저장한다.
2. line 문자열을 writen 함수로 클라이언트에게 그대로 돌려준다.
다음은 echo 클라이언트에 대해 알아보겠음.
TCP echo client
argv[1]의 인자를 ip주소로 받고 서버의 포트 번호로 주소체계를 할당한 후 socket 열고,
connect한다. connect가 되면 str_cli 함수의 인자로 표준입력과 connect 소켓을 주고 함수를 호출한다.
str_cli 함수는 입력은 표준입력으로 받고 출력은 writen으로 한다.
fgets 함수로 표준입력을 읽고 sendline에 저장하고, sendline의 내용을 서버로 write(전송)하고
다음 readline으로 서버가 클라이언트로 전송한 echo 메세지를 받아 fputs로 다시 표준출력한다.
그리고 readline이 0 즉, 더이상 읽을게 없으거나 오류가 나면 종료한다.
메아리(echo)라는 개념은 클라이언트가 서버로 메세지를 보내고 그 메세지 그대로 클라이언트에게 되돌아
오는 것을 말한다.
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
입출력 다중화 (I/O Multiplexing) (0) | 2021.04.11 |
---|---|
시그널 핸들링(SIGCHLD) (0) | 2021.04.11 |
소켓 프로그래밍 (0) | 2021.04.11 |
네트워크 소켓(Socket)은 무엇인가 (0) | 2021.04.11 |
UDP (User Datagram Protocol) (0) | 2021.04.11 |