본문 바로가기
소켓프로그래밍

[C/C++] 소켓 프로그래밍 - 서버와 클라이언트 (2)

by 여름코딩 2024. 6. 25.
반응형

서버와 클라이언트의 의미

저번 시간에는 서버와 클라이언트의 의미에 대해서 알아보았다. 서버는 서비스를 제공하는 컴퓨터로 어떤 서비스를 제공하느냐에 따라서 웹 서버, 프록시 서버, 데이터베이스 서버 등이 있다. 그리고 클라이언트는 서비스를 요청하는 컴퓨터이다.

이번 글에서는 서버와 클라이언트가 동작하는 순서를 함수를 통해 공부할 것이기 때문에 서버와 클라이언트가 각자 어떤 역할을 하는지 궁금하다면 아래 글을 읽어보자.

 

https://fantasycodingworld.tistory.com/120

 

[C/C++] 소켓 프로그래밍 학습 - 서버와 클라이언트 (1)

소켓 활용 예시요즘엔 카카오톡, 라인 등의 메신저가 대두되고 있지만, 예전에는 인터넷 채팅 프로그램으로 1:1 채팅을 했었다. 그리고 제일 유명한 통신 프로그램 중 8~90년대 생이 들어보았을

fantasycodingworld.tistory.com

 

TCP 서버

 

TCP 서버와 클라이언트는 bind(), listen(), accept(), connect(), send(), recv() 등의 함수로 구현 한다. 각 함수의 의미는 아래와 같다.

  • bind() : 소켓 생성 후 실행하는 함수로 주소를 할당한다
  • listen() : 서버 소켓에 bind() 처리가 끝난 후 클라이언트의 연결 요청을 기다린다
  • accpet() : 클라이언트의 연결 요청을 수락하는 함수이다
  • send() : 서버와 클라이언트가 모두 사용하는 함수로 데이터를 보낼 때 쓴다
  • recv() : 서버와 클라이언트가 모두 사용하는 함수로 데이터를 수신할 때 쓴다

그럼 이제 그림으로 서버와 클라이언트의 통신 순서를 알아보자.

서버와 클라이언트 통신 순서

 

먼저, 서버와 클라이언트는 각자 socket을 생성해서 데이터를 전송 할 통로를 마련한다.

 

그리고 서버는 bind()를 통해 포트를 할당한다. 이때 할당된 포트 번호로 접속한 클라이언트만을 수용한다. 다음으로 listen()을 통해 클라이언트의 연결 요청이 오기를 기다리는 상태로 대기한다.

 

이제 클라이언트는 connect()를 통해서 서버에 연결 요청을 하면, 서버에서 accpet()로 요청을 허용한다. 그럼 이때부터 데이터의 송수신이 가능해 진다.

 

클라이언트가 send() 함수를 통해 데이터를 서버 쪽으로 전송하면, 서버는 recv() 함수로 수신한다. 반대로 서버가 데이터를 send() 함수로 전송하면, 클라이언트 또한 recv() 함수로 수신한다. 이렇게 데이터 송수신이 완료되면 서버와 클라이언트는 close()로 소켓을 닫는다.

 

위의 내용을 간략히 요약해보자.

 

1. 서버와 클라이언트의 소켓 생성 (데이터가 오고 갈 길을 열어준다.)

2. 서버는 클라이언트가 잘 찾아올 수 있도록 포트를 bind() 한 후 연결 요청을 받을 준비 listen()을 한다.

3. 클라이언트가 연결 요청 connect()를 하면 서버는 accept()한다.

4. send()로 데이터를 보내고, recv()로 수신한다.

5. 데이터 송수신이 완료되면 소켓을 close()한다.

반응형