1 / 17

Network Programming for Microsoft Window(2)

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 를 사용

mickey
Download Presentation

Network Programming for Microsoft Window(2)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Network Programming for Microsoft Window(2) 2005. 5. 27(금) 한 민 규 hufs96mk@hufs.ac.kr

  2. content • Socket Modes

  3. 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;

  4. WSAEWOULDBLOCK Error • Non-blocking Socket에서 WSAEWOULDBLOCK Err 의미 • Error라기 보다는 아직 요청한 작업이 수행하고 있음을 나타낸다. • SOCKET_ERROR가 리턴한 후에 WSAGetLastError를 Call하여 Error의 정확한 의미를 파악할것.

  5. 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)

  6. Blocking Model • Basic Socket I/O Model • 하나 이상의 스레드가 필요 • Send 와 Recv에 대하여 하나의 스레드를 요구 • 단순한 구조를 가진다. • 각 연결마다 스레드가 필요하므로 시스템 리소스의 낭비가 심해진다.

  7. 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 );

  8. 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))

  9. Select Model(3) • Example Prototype • - 다음주 실습시간

  10. Select Model(4) • Select Model 장점 • 여러 소켓이나 여러가지 I/O에 대하여 하나의 스레드를 이용하여 처리할 수 있다 • 연결이 많아질수록 스레드가 무한정 증가되는 것을 방지할 수 있다 • Select Model 단점 • fd_set에 설정할 수 있는 소켓의 개수가 제한되어 있다 • WINSOCK2.H의 Fd_SETSIZE value = 64로 초기값이 셋팅 되어져 있다.(1024까지 확장가능) • 만약 1024까지 확장한다면?

  11. WSAAsyncSelect Model(1) • WSAAsyncSelect를 사용하면 윈속의 소켓 이벤트를 윈도우 메시지를 통하여 비동기적으로 통보 받을 수 있다. • WSAAsyncSelect 또는 WSAEventSelect는 소켓의 이벤트를 비동기적으로 통보해주는 기능을 제공하지만 이것이 비동기 데이터 송수신을 제공해주는 것은 아니다. 비동기 데이터 송수신은 overlapped 또는 completion port 모델에서 제공한다. • WSAAsyncSelect 함수를 호출하면 자동으로 소켓의 모드는 블럭킹에서 넌블록킹으로 바뀐다. 이경우 WSARecv를 호출한다면? • WSAAsyncSelect 모델을 이용하기 위해서는 우선 CreateWindow를 이용하여 윈도우를 생성하여 윈도우 프리시저(winproc)가 동작되도록 해야 한다.

  12. 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 : 소켓의 프로토콜 패밀리에 대한 로컬 어드레스 리스트가 바뀌었을때 통지 받음

  13. WSAAsyncSelect Model(3) • FD_WRITE의 의미 • WSAConnect 함수를 호출하고 소켓이 처음 연결 되었을 때 • WSAAccept 함수를 호출하고 소켓의 연결이 수락되었을 때 • Send, WSASend, sendto, WSASendTo 함수를 호출하여 WSAEOULDBLOCK이 리턴 되었다가 전송 버퍼가 비워졌을 때 • Select보다 부하 없이 많은 수의 연결을 처리 • WSAAsyncSelect 모델의 단점은 반드시 윈도우가 필요하다 • 윈도우가 필요한 이유는? • 윈도우는 어떻게 이벤트를 활용할까? • WSAAsyncSelect가 윈도우를 사용함으로써 발생하는 문제점은?

  14. 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 로 변함

  15. 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);

  16. WSAEventSelect Model(3) • Event Object가 Signaled State란걸 어떻게 아는가? • State가 바뀌는것을 항상 일일이 체크해야 하는가?

  17. WSAEventSelect Model(4) • WSAWaitForMultipleEvents • 하나 이상의 이벤트 오브젝트의 상태가 시그널 상태로 변화될 때까지 프로세싱을 대기시키는 기능을 제공한다. • 리턴값으로써 시그널 상태로 변한 이벤트의 번호를 알려준다.

More Related