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

Slides:



Advertisements
Similar presentations
Windows Function Windows XP Windows 7 Windows 8 FREE 조장 : 김동환 조원 : 전태우
Advertisements

CHAP 22. 블루투스.
Socket Programming 소개.
10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다.
Dongseo univ. Computer engineering
Chapter 09. 소켓 입출력 모델(I).
SQL Injection Member 최병희, 김상우, 조용준, 유창열.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Ch.07-5 xml-rpc 사용하기 김상엽.
Network Lab. Young-Chul Hwang
Department of Computer Science and Engineering
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
KN A (Rev.1.0) BIXOLON MOBILE PRINTER
범용 소켓 클래스 만들기.
Department of Computer Engineering
Window socket programming
Department of Computer Engineering
Android 시리즈 H2O SIM Card 데이터 사용 설정 방법
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 7장 소켓 연결의 우아한 종료 인공지능실험실 석사 2학기 이희재
Linux서버를 이용한 채팅프로그램 지도 교수님 : 이형원 교수님 이 름 : 이 은 영 학 번 :
TETRIS FOR QTOPIA.
8장. 원격지 시스템 관리하기.
네트워크 프로그래밍 Yang-Sae Moon Department of Computer Science
Chapter 06. UDP 서버/클라이언트.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 9장 소켓의 다양한 옵션 인공지능실험실 박사 1학기 장성만
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
ARP Project 조 충 호 교수님 김 세 진 조교님 조 진 형 변 익 수
10 장 데이터 링크 제어(Data Link Control)
프로젝트 발표 순서 12/7(수), 팀 별 15분 발표순서 PPT (팀 별 이름, 구현 내용, 결과-그래프 포함) 각 기법당
Department of Computer Science and Engineering
13장 고급 입출력 함수 박사 4학기 최 성자.
TCP/IP Socket Programming…
Socket Address Structure and Byte Ordering Functions
10장. 예외처리.
Chapter 5 UDP Socket 소켓 프로그래밍.
Chapter 09. 소켓 입출력 모델(I).
Chapter 07. 소켓 옵션.
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Network Programming - 최종보고서 -
Department of Computer Engineering
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
10 장 데이터 링크 제어(Data Link Control)
10 장 데이터 링크 제어(Data Link Control)
Fucntion 요약.
CHAP 21. 전화, SMS, 주소록.
다중처리 기술 School of Electronics and Information. Kyung Hee University.
프로젝트 제안서 -TCP/IP를 이용한 메신저 구현-
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 04. TCP 서버/클라이언트.
Chapter 02. 윈도우 소켓 시작하기.
모바일(폰)메일 서비스 정흠수 최동훈.
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
5.2.3 교환방식의 비교 학습내용 교환방식의 비교.
9 브라우저 객체 모델.
AdcRead API 함수 분석 마이크로프로세서.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만
실습 UBLAB.
엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice;
Installation Guide.
06. 디바이스의 등록과 해제 김진홍
Network Lab. Young-Chul Hwang
Completion Port기반의 채팅프로그램
CODE INJECTION 시스템B 김한슬.
윈도우 운영체제와 윈도우 응용 프로그램의 특징 SDK 응용 프로그램 MFC 응용 프로그램
20 XMLHttpRequest.
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