10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다.

Slides:



Advertisements
Similar presentations
CHAP 22. 블루투스.
Advertisements

한남대학교 컴퓨터공학과 소프트웨어공학실험실 최 용 준
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
6 데이터 링크 계층.
Chapter 09. 소켓 입출력 모델(I).
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Ch.07-5 xml-rpc 사용하기 김상엽.
1. Windows Server 2003의 역사 개인용 Windows의 발전 과정
Network Lab. Young-Chul Hwang
Department of Computer Science and Engineering
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
Department of Computer Engineering
Department of Computer Engineering
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 7장 소켓 연결의 우아한 종료 인공지능실험실 석사 2학기 이희재
Linux서버를 이용한 채팅프로그램 지도 교수님 : 이형원 교수님 이 름 : 이 은 영 학 번 :
8장. 원격지 시스템 관리하기.
네트워크 프로그래밍 Yang-Sae Moon Department of Computer Science
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Chapter 06. UDP 서버/클라이언트.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 9장 소켓의 다양한 옵션 인공지능실험실 박사 1학기 장성만
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
NJM Messenger 박상원 박연호.
메시지 큐[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…
Advanced Socket Programming
10장. 예외처리.
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Chapter 09. 소켓 입출력 모델(I).
Chapter 07. 소켓 옵션.
메모리 관리 & 동적 할당.
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
뇌를 자극하는 Windows Server 장. 원격 접속 서버.
USN(Ubiquitous Sensor Network)
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
Network Programming - 최종보고서 -
Department of Computer Engineering
클라우드 서버로 부터 값 읽어오기 WiFi 시리얼 보드 활용가이드 김영준 헬로앱스 (
10 장 데이터 링크 제어(Data Link Control)
10 장 데이터 링크 제어(Data Link Control)
웹서버 기능으로 데이터 읽기 및 제어하기 WiFi 시리얼 보드 활용가이드 김영준
CHAP 21. 전화, SMS, 주소록.
다중처리 기술 School of Electronics and Information. Kyung Hee University.
객체기반 SW설계 팀활동지 4.
프로젝트 제안서 -TCP/IP를 이용한 메신저 구현-
( Windows Service Application Debugging )
제 19 장 TCP 대화식 데이터 흐름.
Chapter 04. TCP 서버/클라이언트.
Chapter 02. 윈도우 소켓 시작하기.
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
5.2.3 교환방식의 비교 학습내용 교환방식의 비교.
MIDP 네트워크 프로그래밍 ps lab 김윤경.
9 브라우저 객체 모델.
다자간 채팅프로그램 김형도 허영민
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만
엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice;
Network Lab. Young-Chul Hwang
Completion Port기반의 채팅프로그램
7 생성자 함수.
6 객체.
중간 결과 보고 ( Server & Client )
20 XMLHttpRequest.
Presentation transcript:

10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다. WSAAsyncSelect 소켓 입출력 모델을 이해하고 활용한다. WSAEventSelect 소켓 입출력 모델을 이해하고 활용한다.

소켓 모드 (1) 소켓 모드 블로킹 소켓 블로킹 소켓과 넌블로킹 소켓으로 구분 소켓 함수 호출 시 조건이 만족되지 않으면 함수가 리턴하지 않고 스레드 실행이 정지 조건이 만족되면 소켓 함수가 리턴하면서 정지된 스레드가 깨어나 실행을 재개 소켓 함수 리턴 조건 accept() 접속한 클라이언트가 있을 때 connect() 서버에 접속이 성공했을 때 send(), sendto() 응용 프로그램이 전송을 요청한 데이터를 소켓 송신 버퍼에 모두 복사했을 때 recv(), recvfrom() 소켓 수신 버퍼에 도착한 데이터가 1바이트 이상 있고 이를 응용 프로그램이 제공한 버퍼에 복사했을 때

소켓 모드 (2) 넌블로킹 소켓 소켓 함수 호출 시 조건이 만족되지 않더라도 함수가 리턴하므로 스레드가 중단 없이 다음 코드를 수행 socket() 함수는 기본적으로 블로킹 소켓을 생성하므로 ioctlsocket() 함수를 호출해 넌블로킹 소켓으로 전환 // 블로킹 소켓 생성 SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == INVALID_SOCKET) err_quit("socket()"); // 넌블로킹 소켓으로 전환 u_long on = 1; retval = ioctlsocket(sock, FIONBIO, &on); if(retval == SOCKET_ERROR) err_quit("ioctlsocket()");

소켓 모드 (3) 넌블로킹 소켓과 소켓 함수 넌블로킹 소켓에 대해 소켓 함수를 호출할 때 조건이 만족되지 않으면 소켓 함수는 오류를 리턴 WSAGetLastError() 함수를 이용해 오류 코드를 확인 대개 오류 코드는 WSAEWOULDBLOCK 조건이 만족되지 않았음을 나타내므로 나중에 다시 소켓 함수를 호출하면 됨

소켓 모드 (4) 넌블로킹 소켓의 특징 장점 소켓 함수 호출 시 항상 리턴하므로 조건이 만족되지 않아 스레드가 오랜 시간 정지하는 상황, 즉 교착 상태가 생기지 않는다. 멀티스레드를 사용하지 않고도 여러 소켓에 대해 돌아가면서 입출력을 처리할 수 있다. 필요하다면 중간에 소켓과 직접 관계가 없는 다른 작업을 할 수도 있다. 단점 소켓 함수를 호출할 때마다 WSAEWOULDBLOCK과 같은 오류 코드를 확인하고 처리해야 하므로 프로그램 구조가 복잡해진다. 블로킹 소켓을 사용한 경우보다 CPU 사용률이 높다.

서버 작성 모델 반복 서버 병행 서버 여러 클라이언트를 한 번에 하나씩 처리 여러 클라이언트를 동시에 처리 장점 스레드 한 개만으로 구현하므로 시스템 자원 소모가 적음 단점 한 클라이언트의 처리 시간이 길어지면 다른 클라이언트의 대기 시간이 길어짐 장점 한 클라이언트의 처리 시간이 길어지더라도 다른 클라이언트에 영향을 주지 않음 단점 스레드를 여러 개 생성하여 구현하므로 시스템 자원 소모가 많음

이상적인 소켓 입출력 모델의 특징 이상적인 서버의 기능 이상적인 소켓 입출력 모델의 특징 가능한 많은 클라이언트가 접속 가능 서버는 각 클라이언트의 서비스 요청에 빠르게 반응하며 고속으로 데이터를 전송 시스템 자원 사용량을 최소화 이상적인 소켓 입출력 모델의 특징 소켓 함수 호출 시 블로킹을 최소화 스레드 개수를 일정 수준으로 유지 CPU 명령 수행과 입출력 작업을 병행 유저 모드와 커널 모드 전환 횟수를 최소화

소켓 입출력 모델의 종류 윈도우 운영체제의 소켓 입출력 모델 지원 소켓 입출력 모델 운영체제 버전 윈도우 CE 윈도우 (클라이언트 버전) (서버 버전) Select CE 1.0 이상 윈도우 95 이상 윈도우 NT 이상 WSAAsyncSelect x WSAEventSelect CE .NET 4.0 이상 윈도우 NT 3.51 이상 Overlapped Completion Port 윈도우 NT 3.5 이상(윈도우 95/98/Me 제외)

Select 모델 (1) Select 모델 핵심 원리 select() 함수가 핵심적인 역할을 함 소켓 모드(블로킹, 넌블로킹)와 관계없이 여러 소켓을 한 스레드로 처리 가능 핵심 원리 소켓 함수 호출이 성공할 수 있는 시점을 미리 알 수 있어서 소켓 함수 호출 시 조건이 만족되지 않아 생기는 문제를 해결할 수 있음 블로킹 소켓: 소켓 함수 호출 시 조건이 만족되지 않아 블로킹되는 상황을 방지 넌블로킹 소켓: 소켓 함수 호출 시 조건이 만족되지 않아 나중에 다시 호출해야 하는 상황을 방지

Select 모델 (2) 동작 원리 읽기 셋 쓰기 셋 예외 셋 소켓 select(...); 호출 읽기 셋 쓰기 셋 예외 셋 리턴

Select 모델 (3) 소켓 셋의 역할 - 각각 읽기, 쓰기, 예외 셋 함수 호출 시점 접속한 클라이언트가 있으므로 accept() 함수를 호출할 수 있음 소켓 수신 버퍼에 도착한 데이터가 있으므로 recv(), recvfrom() 등의 함수를 호출해 데이터를 읽을 수 있음 TCP 연결이 종료되었으므로 recv(), recvfrom() 등의 함수를 호출해 연결 종료를 감지할 수 있음 함수 호출 시점 소켓 송신 버퍼의 여유 공간이 충분하므로 send(), sendto() 등의 함수를 호출하여 데이터를 보낼 수 있음 함수 호출 결과 넌블로킹 소켓을 사용한 connect() 함수 호출이 성공함 함수 호출 시점 OOB(Out-Of-Band) 데이터가 도착했으므로 recv(), recvfrom() 등의 함수를 호출하여 OOB 데이터를 받을 수 있음 함수 호출 결과 넌블로킹 소켓을 사용한 connect() 함수 호출이 실패함

Select 모델 (4) select() 함수 int select ( int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout ) ; 성공: 조건을 만족하는 소켓의 개수 또는 0(타임아웃), 실패: SOCKET_ERROR

Select 모델 (5) select() 함수를 이용한 소켓 입출력 절차 ① 소켓 셋을 비움(초기화). ② 소켓 셋에 소켓을 넣음. 넣을 수 있는 소켓의 최대 개수는 FD_SETSIZE(=64)로 정의되어 있음 ③ select() 함수 호출. 타임아웃이 NULL이면 select() 함수는 조건을 만족하는 소켓이 있을 때까지 리턴하지 않음 ④ select() 함수가 리턴하면 소켓 셋에 남아 있는 모든 소켓에 대해 적절한 소켓 함수를 호출하여 처리 ⑤ ①~④를 반복

Select 모델 (6) 소켓 셋을 조작하는 매크로 함수 매크로 함수 기능 FD_ZERO(fd_set *set) 셋을 비움(초기화) FD_SET(SOCKET s, fd_set *set) 셋에 소켓 s를 넣음 FD_CLR(SOCKET s, fd_set *set) 셋에서 소켓 s를 제거 FD_ISSET(SOCKET s, fd_set *set) 소켓 s가 셋에 들어 있으면 0이 아닌 값을 리턴. 그렇지 않으면 0을 리턴

SelectTCPServer 예제의 소켓 정보 관리 (1) 소켓 정보 관리를 위한 구조 SOCKETINFO * SOCKETINFO{} FD_SETSIZE

SelectTCPServer 예제의 소켓 정보 관리 (2) 소켓 정보 추가하기 소켓 정보 추가

SelectTCPServer 예제의 소켓 정보 관리 (3) 소켓 정보 삭제하기 소켓 정보 삭제 이동

WSAAsyncSelect 모델 (1) WSAAsyncSelect 모델 소켓과 관련된 네트워크 이벤트를 윈도우 메시지로 받음 모든 소켓과 관련된 메시지가 한 윈도우, 즉 한 윈도우 프로시저에 전달되므로 멀티스레드를 사용하지 않고도 여러 소켓을 처리 가능

WSAAsyncSelect 모델 (2) 동작 원리 메시지 큐 소켓 관련 메시지 소켓

WSAAsyncSelect 모델 (3) WSAAsyncSelect 모델을 이용한 소켓 입출력 절차 ② 등록한 네트워크 이벤트가 발생하면 윈도우 메시지가 발생하여 윈도우 프로시저가 호출됨 ③ 윈도우 프로시저에서는 받은 메시지의 종류에 따라 적절한 소켓 함수를 호출하여 처리

WSAAsyncSelect 모델 (4) WSAAsyncSelect() 함수 사용 예 int WSAAsyncSelect ( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent ) ; 성공: 0, 실패: SOCKET_ERROR #define WM_SOCKET (WM_USER+1) // 사용자 정의 윈도우 메시지 ... WSAAsyncSelect(s, hWnd, WM_SOCKET, FD_READ|FD_WRITE);

WSAAsyncSelect 모델 (5) 네트워크 이벤트를 나타내는 상수 네트워크 이벤트 의미 FD_ACCEPT 접속한 클라이언트가 있다. FD_READ 데이터 수신이 가능하다. FD_WRITE 데이터 송신이 가능하다. FD_CLOSE 상대가 접속을 종료했다. FD_CONNECT 통신을 위한 연결 절차가 끝났다. FD_OOB OOB 데이터가 도착했다.

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

AsyncSelectTCPServer 예제의 소켓 정보 관리 (1) 소켓 정보 관리를 위한 구조 소켓 정보 추가하기 SOCKETINFO{} SocketInfoList 추가

AsyncSelectTCPServer 예제의 소켓 정보 관리 (2) 소켓 정보 삭제하기 삭제

WSAEventSelect 모델 (1) WSAEventSelect 모델 소켓 함수 호출이 성공할 수 있는 시점을 이벤트 객체를 통해 감지 소켓에 대해 이벤트 객체를 생성하여 짝지어두면 네트워크 이벤트가 발생할 때마다 이벤트 객체가 신호 상태가 됨 이벤트 객체의 상태 변화를 관찰함으로써 네트워크 이벤트 발생을 감지

WSAEventSelect 모델 (2) 동작 원리 네트워크 이벤트 소켓 이벤트 객체 소켓 네트워크 이벤트 발생 이벤트 객체

WSAEventSelect 모델 (3) WSAEventSelect 모델의 필요 기능과 관련 함수 이벤트 객체 생성과 제거 WSACreateEvent(), WSACloseEvent() 소켓과 이벤트 객체 짝짓기 WSAEventSelect() 이벤트 객체의 신호 상태 감지하기 WSAWaitForMultipleEvents() 구체적인 네트워크 이벤트 알아내기 WSAEnumNetworkEvents()

WSAEventSelect 모델 (4) WSAEventSelect 모델을 이용한 소켓 입출력 절차 ① 소켓을 생성할 때마다 WSACreateEvent() 함수를 이용해 이벤트 객체를 생성 ② WSAEventSelect() 함수를 이용해 소켓과 이벤트 객체를 짝지음과 동시에 처리할 네트워크 이벤트를 등록 ③ WSAWaitForMultipleEvents() 함수를 호출해 이벤트 객체가 신호 상태가 되기를 기다림. 등록한 네트워크 이벤트가 발생하면 해당 소켓과 연관된 이벤트 객체가 신호 상태가 됨 ④ WSAEnumNetworkEvents() 함수를 호출해 발생한 네트워크 이벤트를 알아내고 적절한 소켓 함수를 호출해 처리

WSAEventSelect 모델 (5) 이벤트 객체 생성과 제거하기 WSAEVENT WSACreateEvent ( ) ; 성공: 이벤트 객체 핸들, 실패: WSA_INVALID_EVENT BOOL WSACloseEvent (WSAEVENT hEvent) ; 성공: TRUE, 실패: FALSE

WSAEventSelect 모델 (6) 소켓과 이벤트 객체 짝짓기 int WSAEventSelect ( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents ) ; 성공: 0, 실패: SOCKET_ERROR

WSAEventSelect 모델 (7) 이벤트 객체의 신호 상태 감지하기 DWORD WSAWaitForMultipleEvents ( DWORD cEvents, const WSAEVENT *lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable ) ; 성공: WSA_WAIT_EVENT_0 ~ WSA_WAIT_EVENT_0+cEvents-1 또는 WSA_WAIT_TIMEOUT 실패: WSA_WAIT_FAILED

WSAEventSelect 모델 (8) 구체적인 네트워크 이벤트 알아내기 int WSAEnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents ) ; 성공: 0, 실패: SOCKET_ERROR

WSAEventSelect 모델 (9) 예제 코드 SOCKET s; WSAEVENT hEvent; WSANETWORKEVENTS NetworkEvents; ... WSAEnumNetworkEvents(s, hEvent, &NetworkEvents); // FD_ACCEPT 이벤트 처리 if(NetworkEvents.lNetworkEvents & FD_ACCEPT){ if(NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0){ printf("오류 코드 = %d\n", NetworkEvents.iErrorCode[FD_ACCEPT_BIT]); } else{ // accept() 함수 호출

WSAEventSelect 모델 (10) 예제 코드(계속) // FD_READ 이벤트 처리 if(NetworkEvents.lNetworkEvents & FD_READ){ if(NetworkEvents.iErrorCode[FD_READ_BIT] != 0){ printf("오류 코드 = %d\n", NetworkEvents.iErrorCode[FD_READ_BIT]); } else{ // recv() 함수 호출

EventSelectTCPServer 예제의 소켓 정보 관리 (1) 소켓 정보 관리를 위한 구조 SOCKETINFO * SOCKETINFO{} WSA_MAXIMUM_WAIT_EVENTS

EventSelectTCPServer 예제의 소켓 정보 관리 (2) 소켓 정보 추가하기 소켓 정보 추가

EventSelectTCPServer 예제의 소켓 정보 관리 (3) 소켓 정보 삭제하기 소켓 정보 삭제 이동

Thank you www.hanb.co.kr TCP/IP 윈도우 소켓 프로그래밍