WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.

Slides:



Advertisements
Similar presentations
동서 식사예절 박재용이은미. 보기 닫기 카톡 안철수가 빌게이츠에게 면박 당한 이유는...??
Advertisements

1 ‘ 우리나라의 주요공업 ’ - 정도웅, 주민혁, 안수진, 백경민, 엄다운, 박경찬 -.
수유부의 약물복용 시 주의점 발표자 조기성. 모유 수유의 장점 모유 수유의 장점은 ? 위장관 질환 발생감소 영아 돌연사 발생감소 아토피 질환 발생감소 정서적 안정.
미국의 미디어교육 신문방송학과 강진구 한인수 곽모란 이명현.
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
7장. MDI 프로그래밍 MDI 프로그래밍에 대한 내용을 배우도록 한다. 지금까지 배운 것은 생성된 윈도우에 단일 화면이 존재하는 형태였다. 이것을 SDI라고 부르고 Single Document Interface의 약자이다. 하나의 문서를 하나의 화면에 보여주는 형태의.
PRESENTATION 저온화상이란?
공부할 내용 조상들이 살던 곳 자연과 잘 어울리는 한옥 지방에 따라 서로 다른 집의 모양 섬 지방의 집
사랑, 데이트와 성적 자율성 :데이트 성폭력!!! 성폭력예방교육 전문강사 / 여성학 전공 신 순 옥.
1636 쇼핑몰.
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다.
5장. 단축키와 비트맵 윈도우 프로그램에는 화면에서 사용자들의 입력을 받아 들이고 출력을 위한 코드 외 부분이 존재한다. 이 부분을 주로 리소스라고 부르고 이들은 주로 화면에 나타난다. 메뉴, 툴바, 비트맵, 단축키, 대화상자 등이 여기에 속한다. 이 부분들은 우리의 프로그램의.
Chapter 09. 소켓 입출력 모델(I).
퇴계와 율곡의 사회사상 비교 남 일 재 동서대학교 교수/ 정치학 박사 1. 퇴계 이황과 율곡 이이의 약전(略傳)
Understanding of Socket and File I/O
501. 군인들의 세상 502. 민정 이양과 한일회담 이선용.
쌓지 말고 해소하자 이 주휘 이 진영 전 민석 전 혜림.
2015년 하반기 소방교육 자 유 전 공 학 부 (금) 안녕하십니까 자유전공학부 행정실 입니다.
쌍용차 회생계획안을 통한 투기자본(=먹튀자본) 수강과목: 회 계 학 원론 담당교수: 박 성 환 교수님
TCP/IP 소켓 프로그래밍 - C 버전 중에서
제12장 유연한 카메라 클래스 만들기 학기 컴퓨터게임(DirectX).
Department of Computer Engineering
4장. 소켓 유형과 프로토콜 Network Lab. 이 원 구 1.
TCP Client/Server Program
Network Lab. Seoung Hyeon, Lee
제2절 법인세의 계산구조와 세무조정 1. 각 사업연도소득에 대한 법인세 계산구조 회계와 사회 결산서상 당기순이익
범용 소켓 클래스 만들기.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
제 12장 I/O멀티플렉싱(Multiplexing)
Choi Seong Yun 네트워크 프로그래밍 Choi Seong Yun
Chapter 02. 윈도우 소켓 시작하기.
Window socket programming
Department of Computer Engineering
AVR - Chapter 15 황 지 연.
Department of Computer Engineering
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Department of Computer Engineering
Chapter 12. 직렬 통신과 무선 프로토콜.
Advanced Socket Programming
Department of Computer Engineering
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
컴퓨터 개론 및 실습 Dept. Computer Eng. Hankuk University of Foreign Studies
Chapter 09. 소켓 입출력 모델(I).
ARM7s256 ARM7s256 ARM7s256 C h r y s l e r C h r y s l e r
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해
프로젝트 학습 -프로젝트의 운영- 초등교육학과B 정예은.
패시브하우스 신안산대학교 l 건축과 l 박효동, 박창준, 지예림.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Network Programming - 최종보고서 -
마이크로소프트 박종호.
정치개혁의 가능성 논의 권력구조 개편을 통하여 본 -개헌을 통한 정부형태의 변화를 중심으로 [한국정치론] 윤성이 교수님
Department of Computer Engineering
Department of Computer Engineering
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
치료 레크레이션 프로그램 (지적 장애 대상) 과 목: 학 과: 학 번: 이 름: 제 출 일 자 담 당 교 수:
3장. 제어 메시지 처리하기 1/211 1.
노년기 발달 장안대 행정법률과 세류반 정 오 손
의사결정과 의사소통 발표 철학과 나지훈 요약 정치외교학과 양승명 PPT 일본어학과 왕동현 사례 패션학과 강민경
태국 문학 욜라다 왓짜니 싸란차나 팟차라와라이 끼따야펀 르앙다우 타니다.
Department of Computer Engineering
게임과 1학년 Flipping - 파일을 읽어서 출력하는 프로그램
정부조직론 Team 1 발표 제5장 제1절, 제2절 공공정책학부 강철욱 권지호
워밍업 실뭉치 전달게임.
8단계 3층을 완성한다 Case 1 Case 2 Case 3 Case 4
음파성명학 최종욱.
Department of Computer Engineering
Presentation transcript:

WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea

목 차 ◆ WSAAsyncSelec 모델이란? ◆ WSAAsync Select 모델 – 장.단점 ◆ 네트워크 이벤트 ◆ 윈도우 프로시저 ◆ WSAAsyncSelect() 사용시 유의할 점

WSAAsyncSelect() 함수가 핵심적인 역할을 함 윈도우 메시지 형태로 소켓과 관련된 네트워크 이벤트를 처리  멀티스레드를 사용하지 않고도 여러 개의 소켓을 처리 가능 - 윈도우 메시지를 통하여 비동기적으로 소켓을 활용할 수 있음.

● 장점 ● 단점 WSAAsync Select 모델 – 장.단점 - 소켓 이벤트를 윈도우 메시지 형태로 처리하므로, GUI 애플리케이션과 잘 결합 할 수 있음.   ● 단점 하나의 윈도우 프로시저에서 일반 윈도우 메시지와 소켓 메시지를 처리해야 하므로 성능저하의 요인이 됨. 윈도우가 없는 콘솔 프로그램등은 사용할 수 없음.

WSAAsync Select 모델동작원리 메시지 큐 소켓 관련 메시지

WSAAsyncSelect 모델을 이용한 소켓 입출력 절차 ex) 소켓을 통해 데이터를 보내거나 받을 수 있는 상황이 되면 특 정 윈도우 메시지로 알려달라는 내용을 등록. ② 등록한 네트워크 이벤트가 발생하면 윈도우 메시지가 발생하고 윈도우 프로시저가 호출. ③ 윈도우 프로시저에서는 받은 메시지 종류에 따라 적절한 소켓 함수를 호출하여 처리.

WSAAsyncSelect() 함수 int WSAAsyncSelect ( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent ) ; 성공: 0, 실패: SOCKET_ERROR 처리하고자 하는 소켓 메시지를 받을 윈도우의 핸들 윈도우가 받을 메시지 (사용자 정의메시지) 처리할 네트워크 이벤트 종류 (비트 마스크 조합) · 사용자 정의 윈도우 메시지 사용 예 #define MWM_SOCKET (WM_USER+1) ... WSAAsyncSelect(s, hWnd, WM_SOCKET, FD_READ|FD_WRITE);

네트워크 이벤트 FD_ACCEPT 클라이언트가 접속하면 윈도우 메시지를 발생시킨다. FD_READ 의미 FD_ACCEPT 클라이언트가 접속하면 윈도우 메시지를 발생시킨다. FD_READ 데이터 수신이 가능하면 윈도우 메시지를 발생시킨다. FD_WRITE 데이터 송신이 가능하면 윈도우 메시지를 발생시킨다. FD_CLOSE 상대가 접속을 종료하면 윈도우 메시지를 발생시킨다. FD_CONNECT 접속이 완료되면 윈도우 메시지를 발생시킨다. FD_OOB OOB 데이터가 도착하면 윈도우 메시지를 발생시킨다.

윈도우 프로시저 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, 메시지가 발생한 윈도우 msg WSAAsyncSelect() 함수 호출시 등록한 사용자 정의 메시지 wParam 네트워크 이벤트가 발생한 소켓 lParam 하위 16비트는 발생한 네트워크 이벤트, 상위 16비트는 오류 코드 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { .... }

코드 - 1 SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); WSAAsyncSelect(sock, hWnd, MWM_SOCK, FD_ACCEPT|FD_CLOSE); . LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch(iMessage) case WM_CREATE: On_Create(hWnd); break; case MWM_SOCK: On_Socket(hWnd, (SOCKET)wParam, LOWORD(lParam), HIWORD(lParam)); case WM_DESTROY: On_Destroy(); } return (DefWindowProc(hWnd, iMessage, wParam, lParam));

코드 - 2 void On_Socket(HWND hWnd, SOCKET sock, WORD eid, WORD err) { switch(eid) case FD_CLOSE: On_Close(hWnd, sock, eid, err); break; case FD_ACCEPT: On_Accept(hWnd,sock, eid, err); case FD_READ: On_Recv(hWnd, sock, eid, err); }

WSAAsyncSelect() 사용시 유의할 점 Accept()함수가 리턴하는 소켓은 연결 대기 소켓과 동일한 속성을 지님 → 연결 대기 소켓은 직접 데이터 송수신을 하지 않으므로 FD_READ, FD_WRITE 이벤트를 처리하지 않음 그러나 accept() 함수가 리턴하는 소켓은 이벤트 처리를 해야하기 때문에 WSAAsyncSelect() 함수를 다시 호출하여 속성 변경이 필요함 윈도우 메시지를 받았을 때 적절한 소켓 함수를 호출하지 않으면, 다음 번에는 같은 윈도우 메시지가 발생하지 않음 ex) FD_READ 이벤트에 대응하여 recv()를 호출하지 않으면 동일한 소켓에 대한 FD_READ 이벤트는 더 발생하지 않음

. send는 수신측이 recv를 하지 않는다 하더라도 수신버퍼가 꽉차지 않으면 수행 완료 WSAAsyncSelect() 사용시 유의할 점 \\\ SEND SEND SEND SEND SEND 수신버퍼 FD_ CLOSE FD_ READ FD_ READ 메시지 큐 SEND .FD_READ는 수신 버퍼에 수신 데이터가 있게 되면 발생. ( 동시 1개 이상 발행하지 않음 ) . FD_READ 발생시 recv를 send한번에 보낸 만큼만 받게 되는데 이후 아직 수신한 데이 터가 있으면 다시 FD_READ는 발생. . send는 수신측이 recv를 하지 않는다 하더라도 수신버퍼가 꽉차지 않으면 수행 완료 .결론적으로 송신측에서 수신측이 모든 recv를 수행하지 않은 시점(데이터는 다 보냈 지만)에 closesocket을 하게 되며 이런 경우에 FD_CLOSE가 발생을 하면 수신 버퍼 에 이직 recv하지 않은 것이 있는지 확인해야 한다.

WSAAsyncSelect() 사용시 주의할 점 – 수신버퍼 확인 하는 법 void On_Close(HWND hWnd, SOCKET sock, WORD eid, WORD err) { ULONG ulRecv; if(ioctlsocket(sock, FIONREAD, &ulRecv) == 0) if(ulRecv != 0) PostMessage(hWnd, MWM_SOCK, (WPARAM)sock, eid); } else closesocket(sock); 두번째 인자를 FIONREAD를 주고 세번째 인자에 ULONG타입인 변수의 주소를 주면 세번째 인자로 넘긴 주소에 아직 처리되지 않은 수신 버퍼에 있는 데이터의 사이즈를 알 수 있음.

\\\ WSAAsyncSelect() 사용시 주의할 점 수신버퍼 메시지 큐 SEND SEND SEND SEND SEND 수신버퍼 FD_ READ FD_ CLOSE FD_ CLOSE FD_ CLOSE FD_ READ FD_ READ FD_ CLOSE FD_ READ FD_ CLOSE FD_ READ FD_ CLOSE FD_ CLOSE FD_ READ FD_ READ FD_ CLOSE FD_ READ FD_ READ FD_ CLOSE FD_ CLOSE FD_ READ FD_ CLOSE 메시지 큐 .남아 있는 수신버퍼의 처리보다 closesocket이 먼저 이루어지면 안 되기 때문에 메시지 큐 에 FD_CLOSE를 다시 발생 시켜줌으로써 먼저 FD_READ를 수행하게 되고 다시 남은 것이 있으면 당연히 FD_READ가 내부적으로 메시지 큐에 있게 됨. . 이를 반복하다보면 결국은 수신할 데이터가 없게 되고 closesocket을 정상적으로 수행할 수 있는 시기가 오게 됨.

Thank you