Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

WSAEventSelect

이벤트 객체를 소켓과 묶어 준다.

사용 법

int WSAEventSelect(
  __in  SOCKET s,
  __in  WSAEVENT hEventObject,
  __in  long lNetworkEvents
);
  • s : 소켓 지정 번호
  • hEventObject : 이벤트 객체를 지시하는 핸들러
  • lNetworkEvent : 이벤트 객체를 신호 상태로 만들 이벤트 목록

반환 값

만약 소켓에 대해서 관찰할 이벤트 목록을 성공적으로 이벤트 객체와 묶어줬다면 0을 만환한다. 실패했다면 SOCKET_ERROR을 반환한다.

설명

이 함수는 다음과 같이 작동한다.
  • 이벤트 객체와 묶은 소켓에 데이터가 도착하면, 이벤트 객체를 신호 상태로 만든다.
  • 애플리케이션은 신호 상태의 이벤트 객체에서 어떤 소켓에 어떤 이벤트가 발생했는지 확인해서, 데이터를 처리한다.
WSAEventSelect 함수를 호출하면 소켓은 자동적으로 비 봉쇄 모드가 된다. 만약 ioctlsocket(:4100)이나 WSAIoctl(:4100)과 같은 함수로 봉쇄모드로 하지 않는다면, recv(:4100) 함수 반환시 WSAEWOULDBLOCK을 검사해서, 함수 에러인지 아니면 비 봉쇄에서 데이터가 준비되지 않아서 발생한 에러인지를 검사해야 한다. 견고한 애플리케이션을 만들기 원한다면 WSAEventSelect 함수 호출 후 소켓을 봉쇄로 만드는 방법을 고려해볼만 하다.

WSAEventSelect 함수는 lNetworkEvents 매개 변수로 이벤트 객체를 신호 상태로 만들기 위한 이벤트를 지정할 수 있다. 이벤트의 종류는 다음과 같다.
네트워크 이벤트 호출 함수 설명
FD_READ recv(:4100), recvfrom(:4100), WSARecv(:4100), WSARecvFrom(:4100) 입력 이벤트
FD_WRITE send(:4100), sendto(:4100), WSASend(:4100), WSASendTo(:4100) 출력 이벤트
FD_OOB recv(:4100), recvfrom(:4100), WSARecv(:4100), WSARecvFrom(:4100) OOB(긴급 데이터) 이벤트
FD_ACCEPT accept(:4100), WSAAccept(:4100) 클라이언트 연결 요청
FD_CLOSE closesocket(:4100) 종료
FD_QOS WSAIoctl(:4100)
FD_ROUTING_INTERFACE_CHANGE WSAIoctl(:4100)
FD_ADDRESS_LIST_CHANGE WSAIoctl(:4100)
만약 소켓 s에 대해서 읽기/쓰기에 대응하는 이벤트 객체를 지정하려면 다음과 같이 매개 변수 값을 넘기면 된다.
WSAEventSelect(s, hEventObject, FD_READ | FD_WRITE);

이벤트 객체의 설정을 취소하려면 lNetworkEvents에 0을 지정하면 된다.
WSAEventSelect(s, hEventObject, 0);

아래와 같이 WSAEventSelect를 동일한 소켓에 대해서 이벤트 객체를 할당할 경우, 처음 설정만 적용된다.
WSAEventSelect(s, hEventObject1, FD_READ);
WSAEventSelect(s, hEventObject2, FD_WRITE);   // 적용 되지 않는다.

예제