슬라이드 1
슬라이드 2
슬라이드 3
WSAAsyncSelect 모델은 윈도우 메시지 형대로 소켓과 관련된
네트워크 이벤트를 처리합니다. 이 때, 멀티스레드를 사용하지 않고도
여러 개의 소켓을 처리하는 것이 가능합니다.
그래서 WSAAsyncSelect() 함수는 핵심적인 역할을 합니다.
또한 윈도우 메시지를 통하여 비동기적으로 소켓을 활용 할 수 있습니다.
슬라이드 4
WSAAsyncSelect 함수의 장점은 소켓 이벤트를 메시지 형태로 처리하므로
GUI 애플리케이션과 잘 결합 할 수 있습니다.
단점은 반드시 윈도우가 필요하고, 윈도우가 없는 콘솔 프로그램 등은 사용할 수가 없습니다.
슬라이드 5
WSAAsyncSelect 작동 원리는 소켓 관련 메시지를 메시지 큐에 들어오게 되면
들어온 순서로 차례로 실행이 되게 됩니다.
슬라이드 6
WSAAsyncSelect() 함수를 이용하여 소켓을 위한 윈도우 메시지와 처리할
네트워크 이벤트를 등록합니다. 예를 들어 소켓을 통해 데이터를 보내거나 받을 수 있는
상황이 되면 특정 윈도우 메시지로 알려달라는 내용을 등록합니다.
등록한 네트워크 이벤트가 발생하면 윈도우 메시지가 발생하고 윈도우 프로시저가 호출됩니다.
윈도우 프로시저에서는 받은 메시지 종류에 따라 적절한 소켓 함수를 호출하여 처리합니다.
슬라이드 7
WSAAsyncSelect() 함수에는
SOCKET s : 처리하고자 하는 소켓
HWND hWnd : 메시지를 받을 윈도우의 핸들
unsigned int wMsg : 윈도우가 받을 메시지(사용자 정의메시지)
long lEvent : 처리할 네트워크 이벤트 종류(비트 마스크 조합)
슬라이드 8
네트워크 이벤트에 대해 설명하자면
FD_ACCEPT : 클라이언트가 접속하면 윈도우 메시지를 발생시킨다.
FD_READ : 데이터 수신이 가능하면 윈도우 메시지를 발생시킨다.
FD_WRITE : 데이터 송신이 가능하면 윈도우 메시지를 발생시킨다.
FD_CONNECT : 접속이 완료되면 윈도우 메시지를 발생시킨다.
FD_CLOSE : 상대가 접속을 종료하면 윈도우 메시지를 발생시킨다.
슬라이드 9
사용자 정의 윈도우 메시지 사용의 예입니다.
n hwnd
메시지가 발생한 윈도우
n msg
WSAAsyncSelect() 함수 호출시 등록한 사용자 정의 메시지
n wParam
네트워크 이벤트가 발생한 소켓
n lParam
하위 16비트는 발생한 네트워크 이벤트, 상위 16비트는 오류 코드
슬라이드 10
슬라이드 11
WSAAsyncSelect() 함수를 호출하면 해당 소켓은 자동으로 NonBlocking 모드로 전환됩니다.
윈도우 메시지를 받았을 때 적절한 소켓 함수를 호출하지 않으면, 다음 번에는 같은 윈도우 메시지가 발생하지 않는다.
예를 들어 FD_READ 이벤트에 대응하여 recv()를 호출하지 않으면 동일한 소켓에 대한 FD_READ 이벤트는 더 발생하지 않는다.
넌블로킹 모드 : function이 즉시 수행 가능 할 경우에만 수행을 하고 아닐 경우는
실패로 return하는 방식.
블로킹 모드 : function 호출 시 그 function이 해당 기능을 완전히 수행하였거나,
실패하였을 경우에만 return되는 방식. 수행이 완료 될 때까지 대기하게 되므로 blocking방식이라고 부른다.
슬라이드 12
Send는 수신 측이 recv를 하지 않는다 하더라도 수신버퍼가 꽉 차지 않으면 수행 완료.
FD_READ는 수신 버퍼에 수신 데이터가 있게 되면 발생을 한다. (동시 1개 이상 발생하지 않는다)
FD_READ 발생시 recv를 send한번에 보낸 만큼만 받게 되는데 이후
아직 수신한 데이터가 있으면 다시 FD_READ는 발생한다.
결론적으로 송신 측에서 수신 측이 모든 recv를 수행하지 않은 시점(데이터는 다 보냈지만)에
closesocket을 하게 되면 이런 경우에 FD_CLOSE가 발생을 하면 수신 버퍼에
아직 recv하지 않은 것이 있는지 확인 해야 한다.
슬라이드 13
두번째 인자를 FIONREAD를 주고
세번째 인자에 ULONG타입인 변수의 주소를 주면
세번째 인자로 넘긴 주소에 아직 처리되지 않은 수진 버퍼에 있는 데이터의 사이즈를 알 수 있다.
성공적으로 함수가 수행하면, ioctlsocket 함수는 0을 반환 한다.
에러가 발생한 경우는 SOCK_ERROR을 반환한다.
슬라이드 14
남아있는 수신버퍼의 처리보다 closesocket이 먼저 이루어지면 안되기 때문에
메시지 큐에 FD_CLOSE를 다시 발생 시켜줌으로써 먼저 FD_READ를 수행하게 되고
다시 남은 것이 있으면 당연히 FD_READ가 내부적으로 메시지 큐에 있게 된다.
슬라이드 15
실습은 내 IP, 상대 IP에 본인 IP를 입력하고 설정, 연결 버튼을 누르면 메시지박스 창으로
다운로드 완료를 알린다. 그리고 down폴더 안에 a.zip파일이 있으면 실습 완료
슬라이드 16
WSAAsyncSelect발표.pptx
< 강민영 >
기술문서 : http://cafe.daum.net/smbitpro/TGKj/95 (예제- 어싱크 이용 메세지 전송)
http://cafe.daum.net/smbitpro/TGKj/194 (예제-어싱크패킷타이징)
http://cafe.daum.net/smbitpro/TGKj/234 (예제-어싱크 이용 파일전송)
==================================================
< 이종찬 >
http://cafe.daum.net/smbitpro/TGKj/233
==================================================
< 이수영 >
http://cafe.daum.net/smbitpro/TGKj/241
==================================================
< 유미영 >
http://cafe.daum.net/smbitpro/TGKj/257
==================================================