티스토리 뷰

Socket Programming

WSAAsyncSelect Model

열혈허슬러 상추님 2019.09.19 16:32
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가 발생한다.
댓글
댓글쓰기 폼