본문 바로가기
네트워크

[에티버스러닝] select함수 이용해서 여러 명 접속 가능한 TCP 에코 서버

by 송파감자 2023. 6. 1.

에티버스러닝에서 K-digital 트레이닝을 받고 있고, 오늘 첫 시작은 select함수를 이용해서 다수가 접속 가능한 TCP 에코 서버 만들기로 시작했다.

 

일주일이 지나자 모든 게 새로워진 오늘..

개념 정리부터 하자면!

 

TCP 에코서버?

  • TCP 에코 서버는 클라이언트로부터 받은 데이터를 그대로 돌려주는 기능을 가진 서버. 이 서버는 TCP (Transmission Control Protocol)를 사용하여 클라이언트와의 연결을 설정하고, 클라이언트로부터 데이터를 받으면 그 데이터를 동일하게 클라이언트에게 다시 보내는 역할! TCP 에코 서버는 클라이언트와 서버 간의 연결을 확인하고, 데이터 전송에 대한 신뢰성과 순서를 보장하기 위해 TCP를 사용. 이를 통해 클라이언트와 서버 간에 안정적이고 신뢰성 있는 데이터 통신이 가능함
  • 일반적으로 TCP 에코 서버는 네트워크 통신 프로그래밍이나 테스트 목적으로 사용됨. 클라이언트는 TCP 에코 서버에 연결을 요청하고, 서버는 연결을 수락한 후 클라이언트로부터 데이터를 받음. 그 다음, 서버는 받은 데이터를 그대로 클라이언트에게 다시 보냄. 이러한 과정을 클라이언트와 서버 간의 상호작용이 이루어질 때까지 반복함!

 

select()함수?

  • select() 함수는 다중 I/O 작업을 관리하기 위해 사용되는 시스템 호출임. 이 함수는 파일 디스크립터의 상태 변화를 모니터링하고, 이벤트가 발생한 디스크립터를 식별하는 기능을 제공. TCP 에코 서버를 만들 때 select() 함수를 사용하면 다중 클라이언트와의 동시 접속 및 통신을 관리 가능
  • select() 함수는 일반적으로 넌블로킹(non-blocking) I/O 작업을 수행하며, 다음과 같은 파라미터를 사용:
  1. nfds (int): 모니터링할 파일 디스크립터의 개수
  2. readfds (fd_set*): 읽기 이벤트를 모니터링할 파일 디스크립터 집합
  3. writefds (fd_set*): 쓰기 이벤트를 모니터링할 파일 디스크립터 집합
  4. exceptfds (fd_set*): 예외 상황을 모니터링할 파일 디스크립터 집합
  5. timeout (struct timeval*): select() 함수가 블로킹되는 최대 시간 (NULL로 설정하면 무한 대기)

 

TCP서버의 핵심

listen -> accept -> recv-> send -> closesocket

  • 서버 실행해서 클라이언트 접속을 기다림(listen)
  • 클라이언트가 서버 접속(connect) 해서 데이터를 보냄(send)
  • 서버가 클라이언트 접속 수용하고(accept)
  • 클라이언트가 보낸 데이터를 받아서(recv)처리함
  • 서버는 처리한 데이터를 클라이언트에게 보냄(send)
  • 데이터를 주고 받는 과정 모두 마치면 접속 끝는다(closesocket)

 

어려운 부분 코멘트 정리

  • 파일디스크립터?
    •  운영체제에서 열린 파일이나 소켓을 식별하는 데 사용되는 정수 값
  •  fd_set 구조체를 통해서 파일 디스크립터들의 집합 관리
  • FD_ZERO()는 초기화하는 함수
  • FD_SET()은 소켓을 집합에 추가하는 역할!
  • 42번줄 select()함수 호출해서 파일디스크립터의 상태 변경을 감지
    • 얘가 파일디스크립터 중에서 읽을 수 있는 상태인 소켓을 찾아내고 알려주는 역할을 함

  • 56번줄 FD_ISSET?
    • 파일디스크립터 집합에 특정 파일디스크립터가 있는지 확인하는 매크로 함수
    • 얘는 주로 select함수 호출 이후 사용됨.
    • 코드에선 변경된 파일디스크립터 확인해서 해당 소켓에 대한 동작 수행
    • 매개변수! (확인할 파일디스크립터를 나타내는 정수값, 파일디스크립터 집합을 나타내는 fd_set 구조체의 포인터)

 

사실 오늘.. 스레드, 임계영역에 대해서도 배웠는데 너무 어려워서 하루 종일 정신이 나가있었던 것 같다.

이건 다음 포스팅에 계속해서 정리해보겠다.