190712-1 WSAAsyncSelect
윈도우 에서 제공하는 모델이다.
서버를 중심으로 모델을 공부해보자.
● WSAAsyncSelect : 윈도우 메세지 기반의 모델이다. 쓰레드가 없다. 프라이머리스레드를 사용한다. 프라이머리 스레드는 UI에 대한 처리를 하자고 약속되어있다. 그래서 경고가 뜬다. -> WSAEventSelect를 사용하는 것을 권장하도록한다.
기능수행방식(?)
|
플레그 방식
|
완료보고 방식
|
Blocking IO
|
select
|
Overlapped IO
|
쓰레드
|
WSAAsyncSelect
|
IOCP
|
|
WSAEventSelect
|
|
● 차이점
기능수행방식(?)
|
먼저 함수를 호출해서 기능을 수행한다. (함수 반환시 완료다.)
|
플레그🏁 방식
|
OS가 알려준다.(깃발을 드는 방식) (Message, Event 등).
네트워크 이벤트
|
완료보고 방식
|
비동기 방식. 함수호출 -> 바로 반환. 완료가 언제 될지 모름 -> 언제 완료되었는지 확인필요. OS가 완료가 되었는지 알려준다.
|
● 네트워크 이벤트 -> 프로시저에서 처리
● WSAEventSelect : 프라이머리스레드는 메세지나 UI를 처리하고 WSAEventSelect는 또 별도로 네트워크를 처리하는 스레드를 마련했다.
// WSAAsyncSelect()
retval = WSAAsyncSelect(listen_sock, hWnd,
WM_SOCKET, FD_ACCEPT|FD_CLOSE);// 네트워크 이벤트
client_sock = accept(wParam, (SOCKADDR *)&clientaddr, &addrlen);
AddSocketInfo(client_sock);
retval = WSAAsyncSelect(client_sock, hWnd,
WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);// 네트워크 이벤트
● 이후 모든 이벤트는 윈도우 프로시저에서 처리한다. 즉 윈도우(창)가 필요하다.
// 소켓 정보 저장을 위한 구조체
struct SOCKETINFO
{
SOCKET sock;
char buf[BUFSIZE+1];
int recvbytes;
int sendbytes;
BOOL recvdelayed; // recv를 지연시킬 것인가
SOCKETINFO *next; // 다음 노드
};
// 윈도우 메시지 처리
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
switch(uMsg){
case WM_SOCKET: // 소켓 관련 윈도우 메시지
ProcessSocketMessage(hWnd, uMsg, wParam, lParam);// 네트워크 메세지 처리
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
통신 소켓이 만들어지면 가장먼저 FD_WRITE가 발생한다.
'Socket Programming' 카테고리의 다른 글
Overlapped Model struct (0) | 2019.09.21 |
---|---|
WSAEventSelect Model - 2 (0) | 2019.09.20 |
[Socket] SELECT MODEL 네트워크 (0) | 2019.09.18 |
비동기 IO (Overlapped IO) (0) | 2019.09.18 |
File IO, fopen_s, fseek, fread, fclose + 윈도우 소켓 라이브러리 (0) | 2019.07.23 |