Chapter 09. 소켓 입출력 모델(I).

Slides:



Advertisements
Similar presentations
Network Programming:
Advertisements

Python Socket/HTTP overmania. 목표  소켓을 이용하여 기본적인 서버 - 클라이언트 모델을 구현할 수 있다.  간단한 웹서버를 소켓을 이용하여 작성할 수 있다.
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
Java Socket 통신 이개혁 정대준.
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다.
6장. 멀티스레드 멀티스레드 프로그래밍의 필요성을 이해하고 기본 개념을 익힌다.
Chapter 09. 소켓 입출력 모델(I).
Understanding of Socket and File I/O
13장 소켓.
Chapter 06. UDP 서버/클라이언트.
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
마이크로소프트 64bit 윈도우 컴퓨팅 구조와 로드맵
TCP/IP 소켓 프로그래밍 - C 버전 중에서
Department of Computer Engineering
4장. 소켓 유형과 프로토콜 Network Lab. 이 원 구 1.
PHP 웹 프로그래밍 (PHP Web Programming) 네트워크 프로그래밍 문양세 강원대학교 IT대학 컴퓨터과학전공.
TCP/IP Socket Cover Slide 조태문.
14. 입출력 다중화 김진홍
구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef
TCP Client/Server Program
Network Lab. Seoung Hyeon, Lee
Chapter 11. Raw 소켓.
범용 소켓 클래스 만들기.
3장. 소켓 주소 구조체 다루기 소켓 주소 구조체의 정의와 초기화 방법을 익힌다.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
14장 소켓.
제 12장 I/O멀티플렉싱(Multiplexing)
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 03. 클래스의 기본.
Choi Seong Yun 네트워크 프로그래밍 Choi Seong Yun
Using Standard I/O on Sockets
Department of Computer Engineering
Chapter 02. 윈도우 소켓 시작하기.
Window socket programming
Department of Computer Engineering
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
(Web Programming & Practice)
Department of Computer Engineering
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Department of Computer Engineering
Chapter 06. UDP 서버/클라이언트.
Chapter 12. 직렬 통신과 무선 프로토콜.
Advanced Socket Programming
Department of Computer Engineering
13장 고급 입출력 함수 박사 4학기 최 성자.
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Chapter 4 수식과 연산자.
서버 실습 기말과제 게임소프트웨어 b 이도하 Date :2014/12/11(목)
ARM7s256 ARM7s256 ARM7s256 C h r y s l e r C h r y s l e r
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
(분산 통신 실습) : 소켓(Sockets)
TCP / IP 소켓 프로그래밍 3주차 ( Ch.10 ~ Ch.14 ).
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
데이터베이스실험실 석사 2학기 조정희 TCP/IP Socket Programming… 제 19장 윈도우 기반의 쓰레드 동기화 데이터베이스실험실 석사 2학기 조정희
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 09. C언어의 핵심! 함수!
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Network Programming - 최종보고서 -
Department of Computer Engineering
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
Department of Computer Engineering
3장. 제어 메시지 처리하기 1/211 1.
Chapter 04. TCP 서버/클라이언트.
게임과 1학년 Flipping - 파일을 읽어서 출력하는 프로그램
Chapter 03. 소켓 주소 구조체 다루기.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
Department of Computer Engineering
Presentation transcript:

Chapter 09. 소켓 입출력 모델(I)

블로킹과 넌블로킹 소켓 모드의 장단점을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다. 학습 목표 블로킹과 넌블로킹 소켓 모드의 장단점을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다. WSAAsyncSelect 소켓 입출력 모델을 이해하고 활용한다. WSAEventSelect 소켓 입출력 모델을 이해하고 활용한다.

소켓 모드(socket mode) 블로킹 소켓 소켓 모드 (1/4) 소켓 모드(socket mode) 소켓 함수 호출시 동작 방식에 따라 블로킹(blocking)과 넌블로킹(nonblocking) 소켓으로 구분 블로킹 소켓 소켓 함수 호출 시 조건이 만족되지 않으면 함수는 리턴하지 않고 해당 스레드는 대기 상태(wait state)가 됨 소켓 함수 리턴 조건 accept() 클라이언트가 접속했을 때 send(), sendto() 송신 버퍼에 데이터를 모두 복사했을 때 recv(), recvfrom() 수신 버퍼에 도착한 데이터가 있을 때

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

소켓 모드 (3/4) 넌블로킹 소켓과 소켓 함수 넌블로킹 소켓에 대해 소켓 함수를 호출했을 때 조건이 만족되지 않아 작업을 완료할 수 없으면 소켓 함수는 오류를 리턴 WSAGetLastError() 함수를 호출하여 오류 코드를 확인 대개 오류 코드는 WSAEWOULDBLOCK이 되며, 이는 조건이 만족되지 않음을 나타내므로 나중에 다시 소켓 함수를 호출해야 함

넌블로킹 소켓의 특징 소켓 모드 (4/4) 장점 • 소켓 함수 호출 시 블록되지 않으므로 다른 작업 진행 가능 • 멀티스레드를 사용하지 않고도 여러 개의 소켓 입출력 처리 가능 단점 • 소켓 함수를 호출할 때마다 WSAEWOULDBLOCK 등 오류 코드를 확인하고, 다시 해당 함수를 호출해야 하므로 프로그램 구조가 복잡해짐 • 블로킹 소켓을 사용한 경우보다 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 모델 핵심 원리 select() 함수가 핵심적인 역할을 함 소켓 모드(블로킹, 넌블로킹)에 관계없이 여러 개의 소켓을 하나의 스레드로 처리 가능 핵심 원리 소켓 함수를 호출해야 할 시점을 알려줌으로써 함수 호출 시 항상 성공하도록 함 블로킹 소켓: 소켓 함수 호출 시 조건이 만족되지 않아 블로킹 되는 상황을 방지 넌블로킹 소켓: 소켓 함수 호출 시 조건이 만족되지 않아 다시 호출해야 하는 상황을 방지

Select 모델 (2/6) 동작 원리 읽기 셋 쓰기 셋 예외 셋 소켓 읽기 셋 쓰기 셋 예외 셋 소켓

소켓 셋 (각각 읽기, 쓰기, 예외 셋) Select 모델 (3/6) 함수 호출 시점  클라이언트가 접속했으므로 accept() 함수를 호출할 수 있다.  데이터를 받았으므로 recv(), recvfrom() 등의 함수를 호출할 수 있다. 연결이 종료되었으므로 recv(), recvfrom() 등의 함수를 호출할 수 있다. 이때 리턴값은 0 또는 SOCKET_ERROR가 된다. 함수 호출 시점 송신 버퍼가 충분하므로 send(), sendto() 등의 함수를 호출하여 데이터를 보낼 수 있다. 함수 호출 결과  넌블로킹 소켓을 사용한 connect() 함수 호출이 성공하였다. 함수 호출 시점  OOB(Out-Of-Band) 데이터가 도착했으므로 recv(), recvfrom() 등의 함수를 호출하여 OOB 데이터를 받을 수 있다. 함수 호출 결과  넌블로킹 소켓을 사용한 connect() 함수 호출이 실패하였다.

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

select() 함수를 이용한 소켓 입출력 절차 ① 소켓 셋을 비운다(초기화). ② 소켓 셋에 소켓을 넣는다. 셋에 넣을 수 있는 소켓의 최대 개수는 FD_SETSIZE(=64)로 정의되어 있다. ③ select() 함수를 호출한다. select() 함수는 블로킹 함수로 동작하므로 조건이 만족되는 소켓이 있을 때까지 리턴하지 않는다. ④ select() 함수가 리턴한 후 소켓 셋에 존재하는 모든 소켓에 대해 적절한 소켓 함수를 호출하여 처리한다. ⑤ ①~④를 반복한다.

소켓 셋을 다루기 위한 매크로 함수 Select 모델 (6/6) 매크로 함수 역할 FD_CLR(SOCKET s, fd_set *set) 셋에서 소켓 s를 제거 FD_ISSET(SOCKET s, fd_set *set) 소켓 s가 셋에 들어 있으면 0이 아닌 값을 리턴. 그렇지 않으면 0을 리턴 FD_SET(SOCKET s, fd_set *set) 셋에 소켓 s를 넣음 FD_ZERO(fd_set *set) 셋을 비움

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

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

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

WSAAsyncSelect() 함수 사용 예 WSAAsyncSelect 모델 (4/6) 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/6) 네트워크 이벤트 의미 FD_ACCEPT 클라이언트가 접속하면 윈도우 메시지를 발생시킨다. FD_READ 데이터 수신이 가능하면 윈도우 메시지를 발생시킨다. FD_WRITE 데이터 송신이 가능하면 윈도우 메시지를 발생시킨다. FD_CLOSE 상대가 접속을 종료하면 윈도우 메시지를 발생시킨다. FD_CONNECT 접속이 완료되면 윈도우 메시지를 발생시킨다. FD_OOB OOB 데이터가 도착하면 윈도우 메시지를 발생시킨다.

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

WSAEventSelect 모델 WSAEventSelect() 함수가 핵심적인 역할을 함 이벤트 객체를 통해 네트워크 이벤트를 감지  각 소켓에 대해 이벤트 객체를 생성하고, 이 이벤트 객체를 관찰함으로써 멀티스레드를 사용하지 않고도 여러 개의 소켓을 처리 가능

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

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

WSAEventSelect 모델을 이용한 소켓 입출력 절차 ① 소켓을 생성할 때마다 WSACreateEvent() 함수를 이용하여 이벤트 객체를 생성한다. ② WSAEventSelect() 함수를 이용하여 소켓과 이벤트 객체를 짝지음과 동시에, 처리할 네트워크 이벤트를 등록한다. 예를 들면, 소켓을 통해 데이터를 보내거나 받을 수 있는 상황이 되면 이벤트 객체를 신호 상태로 변경하라는 내용을 등록한다. ③ WSAWaitForMultipleEvents() 함수를 호출하여 이벤트 객체가 신호 상태가 되기를 기다린다. 등록한 네트워크 이벤트가 발생하면 해당 소켓과 연관된 이벤트 객체가 신호 상태가 된다. ④ WSAEnumNetworkEvents() 함수를 호출하여 발생한 네트워크 이벤트를 알아내고, 적절한 소켓 함수를 호출하여 처리한다.

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

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

이벤트 객체의 신호 상태 감지하기 WSAEventSelect 모델 (7/10) 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/10) int WSAEnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents ) ; 성공: 0, 실패: SOCKET_ERROR

예제 코드 WSAEventSelect 모델 (9/10) 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() 함수 호출

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