Select model이란
소켓이 읽기, 쓰기 또는 둘 다 준비가 된 상황인지 확인하는 방법이다. 덕분에 소켓 입출력 등이 성공할 때 까지 계속 대기한다던가, 성공할 때 까지 계속 시도한다던가 하는 상황을 어느정도 해결해줄 수 있다.
방법
키워드 : select, fd_set, FD_ZERO, FD_SET, FD_ISSET
- 우선 fd_set 형 변수(소켓 셋)를 선언한다. 소켓 셋은 검사할 소켓의 집합이라고 생각하면 된다. 여기서 검사란 위에 설명한 소켓이 준비가 되었는지 아닌지에 대한 검사이다.
- FD_ZERO 함수로 소켓 셋을 초기화 한다.
- FD_SET 함수로 소켓 셋에 소켓을 추가한다.
- select 함수로 소켓 셋 안에 있는 소켓들 중 읽기 혹은 쓰기가 준비된 소켓만 남기고 소켓 셋에서 지운다.
- FD_ISSET 함수로 특정 소켓이 준비 상태인지 확인한다.
- 소켓이 준비된 상태라면 원하는 작업을 진행해준다.
//1.
fd_set reads;
//2.
FD_ZERO(&reads);
//3.
FD_SET(listenSocket, &reads);
//4.
select(0,&reads, &writes, nullptr,nullptr);
//5.
if(FD_ISSET(listenSocket,&reads))
{
//6.
//Do Someting here
}
주의사항
- select 함수는 동기 방식이다.
- fd_set에는 최대 64개의 소켓만 넣을 수 있다. 그 이상의 소켓을 다루고 싶으면 fd_set을 여러 개 선언해야 한다.
- 위 방법 중 4번 과정에서 준비된 소켓만 남고 나머지는 소켓 셋에서 지워지기 떄문에 검사를 하고싶을 때마다 다시 소켓들을 넣어줘야하는 비효율적인 작업이 수반된다.
'네트워크, 서버' 카테고리의 다른 글
Overlapped 모델(콜백함수) (0) | 2022.04.30 |
---|---|
WSAEventSelect model (0) | 2022.04.29 |
Socket Options (0) | 2022.04.28 |
NAT(Network Address Translation) (0) | 2022.02.21 |
웹 서버 vs 게임 서버 (0) | 2022.01.23 |