170 likes | 323 Vues
Network Programming for Microsoft Window(2). 2005. 5. 27( 금 ) 한 민 규 hufs96mk@hufs.ac.kr. content. Socket Modes. WinSock Socket Modes. Blocking I/O(recv, send) 등의 작업이 끝날 때까지 윈속 함수의 리턴은 대기된다 . Data 를 수신하면서 다른 작업의 수행을 위한 방법 recv(), WSARecv() 의 flags field value = MSG_PEEK 를 사용
E N D
Network Programming for Microsoft Window(2) 2005. 5. 27(금) 한 민 규 hufs96mk@hufs.ac.kr
content • Socket Modes
WinSock Socket Modes • Blocking • I/O(recv, send)등의 작업이 끝날 때까지 윈속 함수의 리턴은 대기된다. • Data를 수신하면서 다른 작업의 수행을 위한 방법 • recv(), WSARecv()의 flags field value = MSG_PEEK 를 사용 • Thread를 사용(Data 처리 Thread, Data 수신 Thread) • Non-Blocking Mode • 윈속 함수는 즉시 리턴된다. • Non-blocking mode로 전환 SOCKET s = socket(AF_INET, SOCK_STREAM, 0); nRet = ioctlsocket(s, FIONBIO, (unsigned long *) &ul; //unsigned long ul = 1;
WSAEWOULDBLOCK Error • Non-blocking Socket에서 WSAEWOULDBLOCK Err 의미 • Error라기 보다는 아직 요청한 작업이 수행하고 있음을 나타낸다. • SOCKET_ERROR가 리턴한 후에 WSAGetLastError를 Call하여 Error의 정확한 의미를 파악할것.
Blocking vs Non-Blocking Modes • Blocking Mode • 개념적으로 이해하기 쉽고 관리가 쉽다. • Request Response 의 반복업무 수행 • 여러 개의 소켓 연결을 관리해야 하거나 데이터를 송수신 하는 순서가 일정치 않은 경우에는 처리가 복잡함 • Non-Blocking Mode • WSAEWOULDBLOCK Err 처리루틴을 작성해야 한다. • 코드가 Blocking Mode보다 길어질 수 있다. 비동기적으로 하나 이상의 Socket 통신을 관리하기 위해서 6가지 Socket I/O모델을 Winsock에서 제공 (Blocking , select, WSAAsyncSelect, WSAEventSelect, overlapped, completion port)
Blocking Model • Basic Socket I/O Model • 하나 이상의 스레드가 필요 • Send 와 Recv에 대하여 하나의 스레드를 요구 • 단순한 구조를 가진다. • 각 연결마다 스레드가 필요하므로 시스템 리소스의 낭비가 심해진다.
Select Model(1) • Select Model? • I/O의 처리의 중심에 select()를 사용한다. • UNIX 기반의 버클리 소켓에서 사용되던 모델 • 윈속1.1부터 가능하며 블록킹 없이 하나 이상의 소켓들의 I/O를 다루기 위하여 사용된다. • 장점 • 소켓이 블록킹 모드일 때는 send나 recv를 사용할 때 블록킹되는 것을 막을 수 있다. • 넌블록킹 모드일 때는 WSAEWOULDBLOCK에러가 발생되는 것을 막을 수 있다. • Select함수는 소켓이 특정 조건에 다다를 때까지 블록된다. int select( int nfds, //버클리 소켓과 호환을 위한 패딩 fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout );
Select Model(2) • readfds는 다음과 같은 경우를 체크 • 수신할 데이터가 있는가? • 연결이 끊어졌는가?(close, reset, terminate) • Listen 호출 후에 새로운 연결이 대기중이어서 accept가 성공할 것인가? • Writefds는 다음과 같은 경우를 체크 • 데이터가 송신되었는가? • 연결이 성공되었는가?(넌블록킹 모드에서 연결을 시도했다면) • Exceptfds는 다음과 같은 경우를 체크 • 연결이 실패하였는가?(넌블록킹 모드에서 연결을 시도했다면) • 수신할 OOB데이터가 있는가? • Timeout timeval 구조체 셋팅 • Struct timeval { long tv_sec; long tv_usec; }; • tv_sec (초), tv_usec(1/1000(milisecond))
Select Model(3) • Example Prototype • - 다음주 실습시간
Select Model(4) • Select Model 장점 • 여러 소켓이나 여러가지 I/O에 대하여 하나의 스레드를 이용하여 처리할 수 있다 • 연결이 많아질수록 스레드가 무한정 증가되는 것을 방지할 수 있다 • Select Model 단점 • fd_set에 설정할 수 있는 소켓의 개수가 제한되어 있다 • WINSOCK2.H의 Fd_SETSIZE value = 64로 초기값이 셋팅 되어져 있다.(1024까지 확장가능) • 만약 1024까지 확장한다면?
WSAAsyncSelect Model(1) • WSAAsyncSelect를 사용하면 윈속의 소켓 이벤트를 윈도우 메시지를 통하여 비동기적으로 통보 받을 수 있다. • WSAAsyncSelect 또는 WSAEventSelect는 소켓의 이벤트를 비동기적으로 통보해주는 기능을 제공하지만 이것이 비동기 데이터 송수신을 제공해주는 것은 아니다. 비동기 데이터 송수신은 overlapped 또는 completion port 모델에서 제공한다. • WSAAsyncSelect 함수를 호출하면 자동으로 소켓의 모드는 블럭킹에서 넌블록킹으로 바뀐다. 이경우 WSARecv를 호출한다면? • WSAAsyncSelect 모델을 이용하기 위해서는 우선 CreateWindow를 이용하여 윈도우를 생성하여 윈도우 프리시저(winproc)가 동작되도록 해야 한다.
WSAAyncSelect Model(2) • Prototype • WSAAsyncSelect 함수의 이벤트 타입 int WSAAsyncselect( SOCKET s, HWND hwnd, unsigned int wMsg, //Event 가 발생했을 때 통보될 윈도우 메시지 번호 long lEvent //전달받은 소켓 이벤트의 종류를 지정하는 bit mask ); FD_READ : 수신할 데이터가 있을 때 통지 받음 FD_WRITE : 전송이 완료되었을 때 통지 받음 FD_OOB : OOB데이터가 도착했을 때 통지 받음 FD_ACCEPT : 연결 요청이 들어왔을 때 통지 받음 FD_CONNECT : 연결이 완료되거나 멀티캐스트 가입이 완료 되었을 때 통지 받음 FD_CLOSE : 소켓이 종료되었을 때 통지 받음 FD_QOS : 소켓의 QOS가 변하였을 때 통지 받음 FD_GROUP_QOS : 소켓 그룹 QOS가 변하였을 때 통지 받음 FD_ROUTING_INTERFACE_CHANGE : 목적지에 대한 라우팅 인터페이스가 바뀌었을 때 통지 받음 FD_ADDRESS_LIST_CHANGE : 소켓의 프로토콜 패밀리에 대한 로컬 어드레스 리스트가 바뀌었을때 통지 받음
WSAAsyncSelect Model(3) • FD_WRITE의 의미 • WSAConnect 함수를 호출하고 소켓이 처음 연결 되었을 때 • WSAAccept 함수를 호출하고 소켓의 연결이 수락되었을 때 • Send, WSASend, sendto, WSASendTo 함수를 호출하여 WSAEOULDBLOCK이 리턴 되었다가 전송 버퍼가 비워졌을 때 • Select보다 부하 없이 많은 수의 연결을 처리 • WSAAsyncSelect 모델의 단점은 반드시 윈도우가 필요하다 • 윈도우가 필요한 이유는? • 윈도우는 어떻게 이벤트를 활용할까? • WSAAsyncSelect가 윈도우를 사용함으로써 발생하는 문제점은?
WSAEventSelect Model(1) • WSAAsyncSelect와 차이점은 윈도우 메시지가 아닌 이벤트 오브젝트를 통하여 소켓의 이벤트를 전달 받는것이다. • 통보받을 이벤트를 등록하기 위하여 WSAEventSelect를 사용한다. WSAEVENT WSACreateEvent(void); Int WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents); hEventObject : 이벤트를 전달받을 이벤트 오브젝트 lNetworkEvents : 전달받을 소켓 이벤트의 종류를 지정하는 비트마스크 operation mode vs operation state Operation mode - Manual reset vs auto reset Operation state – signaled operation state vs non-signaled operating state WSACreateEvent()의 Default Event Object value = manual reset , non-signaled Socket Event 발생시 Operation mode는 signaled 로 변함
WSAEventSelect Model(2) • Event Object가 manual reset mode일경우 I/O를처리하고 난 이후에는 Event Object를 수동으로 reset시켜야 한다. • Event Object의 사용이 끝나면 WSACloseEvent 함수를 이용하여 Event Handle을 반환한다. BOOL WSAResetEvent(WSAEVENT hEvent); BOOL WSACloseEvent(WSAEVENT hEvent);
WSAEventSelect Model(3) • Event Object가 Signaled State란걸 어떻게 아는가? • State가 바뀌는것을 항상 일일이 체크해야 하는가?
WSAEventSelect Model(4) • WSAWaitForMultipleEvents • 하나 이상의 이벤트 오브젝트의 상태가 시그널 상태로 변화될 때까지 프로세싱을 대기시키는 기능을 제공한다. • 리턴값으로써 시그널 상태로 변한 이벤트의 번호를 알려준다.