'부스러기 > 네트워크' 카테고리의 다른 글

윈도우즈 소켓 프로그래밍  (0) 2012.08.01

[윈도우즈 Socket함수]

- Winsock API는 개발자를 위한 헤더와 라이브러리 파일과 애플리케이션에서 사용하는 DLL파일로 구성됨.

- Winsock환경의 핵심은 소켓임....

 

[WSAStartup()]

- Winsock프로그램을 시작하기 위해서는 WSAStartup()함수를 호출해야함.

- 프로그램이 사용할 Winsock버전 정보를 운영체제에 전달하는 역할을 수행.

- int WSAStartup(WORD wVersion, LPWSDATA lpWSAData)

(1번째 파라미터: Winsock버전, 2번째 파라미터: Winsock라이브러리정보를 포함하는 구조체를 참조함.)

 

[WSACleanup()]

- Winsock라이브러리를 사용후 반드시 풀어주어야함.

- 프로그램에서 Winsock함수 사용을 종료한다는 신호만 전달함.

 

[Winsock함수]

           서버                                              클라이언트

    WSAStartup()                                   WSAStartup()

     WSASocket()                                    WSASocket()

          bind()

         listen()

     WSAAccept()    <------------------      WSAConnect()

       WSARecv()     <------------------         WSASend()

      WSASend()      ------------------>        WSARecv()

         close()          <---------------->            close()

    WSACleanup()                                  WSACleanup()

 

[Winsock 넌블로킹 소켓함수]

- 원하지 않는 블로킹 현상을 예방하는 아주 간단하고 원칙적인 솔루션은 입출력 함수가 호출 되었을때 블록하지 않도록 설계된 소켓을 사용하는 목적

- 넌블로킹 소켓을 사용함으로써, 데이터를 수집하거나 전송할 소켓을 찾는데 사용할수도 있슴.

ioctlsocket(SOCKET s, long cmd, u_long FAR* argp)

(s는 설정해야하는 소켓을, cmd는 소켓에서 수행할 동작을, argp는 커맨드 파라미터임.)

 

[WSAAsyncSelect()]

- 이벤트기반의 네트워크 소켓.

- 모니터링할 소켓과 소켓 이벤트가 발생할 때 해당창으로 전송할 원도우즈 메시지 값을 포함함.

- int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent)

(s는 모니터링할 소켓을, hWnd는 이벤트 메시지를 수집할 부모창을 정의하며, wMsg는 전송할 실제 이벤트를 정의, lEvent는 소켓에서 모니터링할 이벤트를 정의함.)

 

* WSAAsyncSelect() 이벤트타입

   이벤트                                                                    설명

FD_ACCEPT                                     소켓에 새로운 연결이 확립됨.

FD_ADDRESS_LIST_CHANGE           소켓의 프로토콜 유형에 대한 로컬 주소 리스트가 수정됨.

FD_CLOSE                                       기존의 연결이 종료됨.

FD_CONNECT                                  소켓이 원격 호스트와 연결을 확립함.

FD_GROUP_QOS                             소켓 유형의 QoS값이 수정됨.

FD_OOB                                          소켓에서 대역 외(out-of-band) 데이터를 수집함.

FD_QOS                                          소켓의 QoS값이 수정됨.

FD_READ                                         소켓에 있는 데이터를 읽어들일 준비가 됨.

FD_ROUTING_INTERFACE_CHANGE 소켓의 라우팅 인터페이스가 특정목적에 대해서 수정됨.

FD_WRITE                                       소켓이 데이털르 출력할 준비가 됨.

 

[WSAEventSelect()]

- 윈도우즈 메시지를 통해서 소켓 통지를 처리하지 않고 대신 이벤트객체핸들을 통해 처리함.

- 여러 소켓이벤트를 처리하는데 각각에 대해서 별개의 윈도우즈 메서드를 생성하고 싶을때 사용..

- 먼저 WSACreateEvent()함수를 사용하여 고유의 이벤트를 정의해야함.

- WSASelect(SOCKET s, WSAEVENT hEvent, long lNetworkEvents)

(s는 모니터링할 소켓을, hEvent는 소켓 이벤트가 발생할 때 생성될 이벤트를 정의하며, lNetworkEvent는 모니터링할 모든 소켓이벤트의 비트와이즈 조합임.)

- 소켓 이벤트가 발생하면, WSACreateEvent()에서 지정한 이벤트 메서드가 실행됨.

 

[입출력오버랩(I/O)]

- 프로그램으로 하여금 독특한 데이터 구조(WSAOVERLAPPED)를 이용하여 한번에 한개 이상의 비동기 입출력 요청을 발생시킬 수 있도록 함.

- 소켓이 이벤트를 수집하면서 동시에 여러 개의 이벤트를 호출할 수 있기 때문에 이 이벤트들은 오버랩되는 것으로 간주됨.

- 이기법을 사용하기 위해서는 우선 오버랩이 가능하도록 설정된 플래그를 사용하여 WSASocket()함수로 소켓을 생성해야함.

-  64개의 이벤트로 한정하여 정의할 수 밖에 없기 때문에 대규모 네트워크 애플리케이션에는 적합하지 않음.

- 단일 스레드에서 처리됨...

 

[완료포트]

- 이벤트를 복수의 스레드로 나누어서 처리하기 위해 사용됨.....

- 각 프로세서에 대해서 별개의 스레드를 생성하므로써, 각 프로세서에서 복수의 소켓을 동시에 모니터링하는 것이 가능함.


출처:http://byung2love.blog.me/140020497881

+ Recent posts