타임아웃을 위한 비동기 소켓 접속시 select 에는 보통 아래와 같은 패턴으로 오류점검을 하게 된다. 이때 select 함수에 사용되는 3개의 fd_set 이 의미하는 바는 아래와 같다.
... iRet = WSAStartup( ... ); ... skConnect = socket( ... ); ... iRet = ioctlsocket( skConnect, FIONBIO, &lNonBlock ); ... if ( SOCKET_ERROR == connect( ... ) { FD_ZERO(&wset); FD_SET(skConnect, &wset); FD_ZERO(&eset); FD_SET(skConnect, &eset); iRet = select((int)(SOCKET)skConnect+1, NULL, &wset, &eset, &timeout); ... if( !FD_ISSET(skConnect, &wset) || FD_ISSET(skConnect, &eset) ) { /// } ... }
- readfds
- 해당 소켓에 대해 수신할 데이터가 있으면 세팅된다.
- 해당 소켓이 끊어졌으면 세팅된다.
- 해당 소켓이 listen 후에 새로운 연결이 대기중이어서 accept가 성공할 가능성이 있으면 세팅된다.
- writefds
- 해당 소켓을 통해 데이터가 송신되었으면 세팅된다.
- 해당 소켓이 넌블럭모드에서 연결을 시도했다면, 연결이 성공하였을 경우 세팅된다.
- exceptfds
- 해당 소켓이 넌블럭모드에서 연결을 시도했다면, 연결이 실패하였을 경우 세팅된다.
- 해당 소켓에 대해 수신할 OOB 데이터가 있으면 세팅된다.
getsockopt( pCtx->hSocket, SOL_SOCKET, SO_ERROR, (char*)&dwOptError, &dwOptErrorLen );끝.
최근 댓글