본문 바로가기

프로그래밍

[펌] ACE 강의(1)

출처: 온라인서버제작자모임

설치

  • 최신버젼 : 5.6
  • $ACE_ROOT : ...ACE_wrappers 폴더
  • 홈페이지 : http://www.cs.wustl.edu/~schmidt/ACE.html
  • 다운로드 링크 : http://download.dre.vanderbilt.edu/
  • config.h 파일 작성법

    • $ACE_ROOT/ace/config.h 파일을 생성
    • #define ACE_HAS_STANDARD_CPP_LIBRARY 1 // 표준 C++ 헤더화일(iostream, vector등)을 사용
    • #define ACE_HAS_MFC 1 // MFC를 사용할 경우에 넣으라고 문서에는 되어 있는데 안 넣고 사용해도 아직까지 큰 문제 없었음. 일단 빼는 게 좋을듯
    • #define ACE_USES_WCHAR 1 // 유니코드 사용.
    • #define ACE_NTRACE 0 // 로그에 트레이스를 남긴다. stdafx.h 에서 선언해줘도 된다.
    • #include "ace/config-win32.h" 는 가장 마지막 라인에
  • runtime library(다중 스레드 디버그/DLL)은 프로젝트에서 직접 세팅(디폴트는 다중 스레드 디버그 DLL)
  • $ACE_ROOT/ace/ace.sln 을 컴파일(vc8.0 용은 따로 있음) : ace.lib aced.lib 생성
  • static library는 $ACE_ROOT/ace/ace_Static.sln : aces.lib, acesd.lib 생성
  • static library를 이용하려면 반드시 ACE_AS_STATIC_LIBS를 프로젝트 설정->전처리기에서 선언해주어야 링크에러가 나지 않음
  • $ACE_ROOT 가 포함 디렉토리, $ACE_ROOT/lib가 라이브러리 디렉토리

 

기본적인 TCP/IP 소켓 사용법

  • native api를 이용한 예제와 ACE 버젼의 예제 비교
  • ACE를 사용하면 사용하기 쉽고, 보다 일관성 있으며, 이식 가능한 객체지향적 접근 방법을 가질 수 있게 됨.
  • 간단한 클라이언트 예제 코딩
  • send_n(), recv_n() 메소드 설명
  • ACE_SOCK_IO : ACE socket의 다양한 I/O method에 대한 wrapper.
  • ACE_SOCK_Stream : 자주 사용하게 되는 tcp 소켓 클래스
  • ACE_INET_Addr : Internet 도메인과 ip, port를 표현해주는 주소 wrapper. sockaddr_in
  • ACE_SOCK_Acceptor : 새로운 ACE_Stream을 passive하게 생성해주는 factory.
  • ACE_SOCK_Connector : 원격의 ip / port 에 접속하여 ACE_Stream을 active하게 생성해주는 factory

 

Reactor

  • Reactor의 정의 : ACE_Reactor에 감시할 이벤트와 ACE_Event_Handler를 등록(register_handler)하고 event_loop를 호출해주면 이벤트 발생시 ACE_Event_Handler의 특정 함수(handle_input, handle_close 등)를 호출해준다. Async방식.
  • Linux/Unix의 select(), poll()  / Windows의 WaitForMultipleObject()와 같은 이벤트 다중 수신 장치(demultiplexer)에 기초
  • 하나의 스레드에서 여러개의 이벤트를 처리할 수 있게 해줌.
  • ACE_Event_Handler :  I/O, 타이머, signal 같은 다양한 이벤트들을 처리 할수 있는 추상 인터페이스.
  • Reactor 서버 간단 코딩
  • SimpleClient와 접속 테스트
  • EchoTest Testcase 작성 : TS_ASSERT, TS_ASSERT_EQUALS, TS_ASSERT_SAME_DATA
  • send_n() 메소드

    • 토막 전송(short writes) : 원격 호스트에 일정량의 데이터를 송신하였지만 네트워크 혼잡 혹은 버퍼 오버플로우 와 같은 이유로 전송 요청한 데이터의 일부만 전송되는 현상
    • send_n() 메소드는 이런 재전송 시도를 내부적으로 간단히 처리하며, 전송이 성공적으로 완료되거나 실패할때까지 blocking 상태에 놓이게 됨.
  • ACE_Reactor.run_reactor_event_loop() 함수를 깨우는 방법.

 

ACE의 역사

  • The ADAPTIVE Communication Environment
  • 더글라스 슈미츠가 그의 박사 논문(ADAPTIVE 프로젝트)으로 발표한 것을 오픈소스 배포 모델로 전환한 것

    • ADAPTIVE의 코드는 객체지향적으로 작성이 되어 있으나 프로세스, 스레드, 잠금장치, 소켓, 메모리 와 같은 운영체제 자원에 접근할때는 C의 디자인으로 돌아가게 됨.
    • 동일한 반복된 코드가 접속 구축, 동기적 이벤트 다중 수신 및 디스패칭, 동기화, 동시 처리 같은 네트워크 프로그래밍에 관련된 작업을 다루면서 생산됨.
  • 그후 연구자 들이나 산업계의 연구/개발 그룹에 의해서만 사용됨.
  • 스티브 휴스턴은 네트워크 어플리케이션 컨설팅 일을 하다가 일정이 급한 일을 맡게되어 빠르게 개발 할 수 있는 라이브러리를 찾다가 ACE를 접하게 됨. 하지만 그 당시 ACE는 그의 프로젝트 플랫폼(Unixware)로 이식되지 않았기 때문에 스스로 이식을 하게되면서 ACE에 대해 충분히 배울 수 있었음. 그 후로 ACE가 상업적으로도 충분히 이용이 가능할 정도로 신뢰성이 높다는 사실이 알려지면서 상업적인 프로젝트에도 많이 사용되게 됨. 휴스턴은 경험을 살려서 ACE의 상업적인 이용을 위한 기술적 지원이 필요하다는 사실을 알게되고 RiverAce를 세우고 기술 컨설팅을 시작.
  • 현재 ACE 개발을 주도하는 사람은 40명
  • 전 세계적으로는 수천의 개발자들이 참여하고 있음.

 

Acceptor-Connector 패턴

  • 개요 : 접속 및 초기화에 필요한 처리와 접속 이후의 처리(send/recv)를 분리함으로써 재사용성 및 확장성을 향상 시킴.
    • Service Handler : application service를 구현한다. 일반적으로 client나 server의 로직을 표현
    • Acceptor : 수동적으로 connection을 확립하고 Service Handler를 생성
    • Connector : 능동적으로 connection을 확립하고 Service Handler를 생성
    • Dispatcher : 연결 요청이 오면 acceptor 에게 알려주고 연결이 확립되면 connector에게 알려준다.
  • ACE_Svc_Handler : ACE_Task를 상속받은 클래스. ACE_Task 부모 클래스중에 ACE_Event도 있기 때문에 Event 추상 인터페이스도 가지고 있고 스트림 클래스(ACE_SOCK_Stream)를 포함 하고 있어서 네트워크/이벤트 처리에 다양하게 사용할 수 있다. 잠금 타입도 지정 가능한데 이것은 ACE_Task가 멤버 변수로 가지고 있는 ACE_Message_Queue의 잠금타입을 지정하기 위해서 이다.
  • Acceptor는 ACE_Acceptor를  Connector는 ACE_Connector를 이용하여 구현. Service_Handler는 ACE_Svc_Handler 사용.

 

참고자료

  • books : C++NPV1 / C++NPV2 / APG
  • $ACE_ROOT/example

    • C++NPV1
    • C++NPV2
    • APG
  • $ACE_ROOT/apps

    • JAWS : http://www.dre.vanderbilt.edu/JAWS/
  • Goole groups

    • http://groups.google.co.kr/group/comp.soft-sys.ace/topics?hl=ko : Schmidt , Huston씨가 직접 답변
    • http://groups.google.co.kr/group/kaug-bbs?hl=ko : 한국 ACE 유저 그룹
  • Wiki

    • http://www.redwiki.net/wiki/wiki/ACE : ACE 책 3권의 역자인 권태인씨가 운영하는 위키
    • http://deadwi.jaram.org/wiki/wikka.php?wakka=ACE : vc7.1 이상에서 설치 방법 등
    • http://www.vitamincpp.net/wiki/wiki.php/ACE~ : 튜토리얼 번역
    • http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/ACE/Documents/tutorialv1 : ACE 소개
    • http://reiot.springnote.com/pages/87294
  • 유료 컨설팅

    • http://www.riverace.com : 월 4만원에서 25만원 까지 다양한 서비스.
  • Google

    • 패턴 이름, 파일타입은 pdf 로 검색하면 좋은 자료를 찾을 수 있음 : ex) reactor filetype:pd

    본문에 쓰인 예제소스 및 ppt파일