WSAEVENT WSAAPI WSACreateEvent();
WSACreateEvent : 수동 리셋 모드의 이벤트 객체를 반환하며 초기 상태는 비신호 상태이다. 이름이 없기 때문에 자식프로세스에서 상속할 수 없다.
WSASetEvent, WSAResetEvent, WSACloseEvent 등으로 이벤트 객체의 신호 발생과 객체 소멸을 발생시킬 수 있다.
int WSAAPI WSAEventSelect(
SOCKET s,
WSAEVENT hEventObject,
long lNetworkEvents
);
특정 소켓과 WSAEVENT 객체를 연결시키고 소켓에 대한 네트워크 이벤트가 감지되었을 때 해당 이벤트 오브젝트를 신호상태로 만들어준다. lNetworkEvents 인자에 관찰하고자하는 네트워크 이벤트 종류를 담는다. (FD_READ | FD_WRITE | FD_CONENCT | FD_ACCEPT) 등
int WSAAPI WSAEnumNetworkEvents(
SOCKET s,
WSAEVENT hEventObject,
LPWSANETWORKEVENTS lpNetworkEvents
);
WaitForXXX를 통해 해당 이벤트가 발생했음을 감지하고 위 함수를 통해 어떤 이벤트가 발생했는지 알 수 있다.
// 이벤트 감지
eventID = ::WaitForSingleObject(m_hSelectEvent, INFINITE);
// 소켓 이벤트가 발생했을 때 받아온다.
// m_SelectEvent에서 네트워크 이벤트를 가져온다.
eventID = WSAEnumNetworkEvents(m_hSocket, m_hSelectEvent, &networkEvents);
// 만약 eventID가 SOCKET_ERROR일 경우 무엇이 잘못된 것이므로 스레드를 종료한다.
if (eventID == SOCKET_ERROR)
{
LOG_OUT("Event ID is Error : %s\n", GetLastErrorMsg().c_str());
return;
}
else
{
// Connect 이벤트가 발생했을 경우
if (networkEvents.lNetworkEvents & FD_CONNECT)
{
// 가상 함수를 호출한다.
OnIoConnected();
if (networkEvents.iErrorCode[FD_CONNECT_BIT])
return;
}
// 사용하지 않는 이벤트
else if (networkEvents.lNetworkEvents & FD_WRITE)
{
// OnIoWrite();
}
// Read 이벤트
else if (networkEvents.lNetworkEvents & FD_READ)
{
OnIoRead();
}
// Disconnect 이벤트
else if (networkEvents.lNetworkEvents & FD_CLOSE)
{
OnIoDisconnected();
return;
}
}
'Computer Science 기본 지식 > 소켓 프로그래밍' 카테고리의 다른 글
논블로킹 소켓 WSA 함수 (TCP / UDP) (0) | 2021.08.21 |
---|---|
[TCP/IP 소켓 프로그래밍] 소켓 옵션 LINGER (0) | 2021.08.20 |
[게임 서버 프로그래밍 교과서] IOCP 서버 (0) | 2021.08.19 |
[게임 서버 프로그래밍 교과서] Poll을 이용한 논블로킹 서버 (0) | 2021.08.19 |
[게임 서버 프로그래밍 교과서] 블로킹 소켓 ManyClient - ManyServer 구조 (0) | 2021.08.19 |