ACE Proactor에서 peer의 ip알아내기

ACE 프로그래머 가이드(APG)의 8장에 나와있는 Proactor 예제를 기준으로 설명하겠습니다. APG가 없으신 분은 ACE 배포본의 ACE_wrappers/examples/APG/Proactor/ 에 나와있는 예제를 참고하시면 됩니다.

다음은 클래스 내에서 구현된 예제 입니다. 다른 함수는 생략하고 관련 함수만 넣었습니다.
class HA_Proactive_Acceptor :
    public ACE_Asynch_Acceptor<HA_Proactive_Service>
{
public:
    HA_Proactive_Service* make_handler(void)
    {
        this->pass_addresses(true);
        return new HA_Proactive_Service;
    }
};

class HA_Proactive_Service : public ACE_Service_Handler
{
public:
    void addresses(const ACE_INET_Addr& remote, const ACE_INET_Addr& local)
    {
        const int max_addr_len = 32;
        char ip_port[max_addr_len] = {0,};
        remote.addr_to_string(ip_port, max_addr_len);

        char ip[max_addr_len] = {0,};
       remote.get_host_addr(ip, max_addr_len);
    }
};


  1. HA_Proactive_Acceptor 클래스에서 virtual HANDLER* make_handler() 함수를 구현합니다.
  2. 구현한 make_handler() 함수에서 this->pass_addresses(1) 함수를 호출합니다.
  3. HA_Proactive_Service 클래스에서 virtual void addresses(...) 함수를 구현합니다.
  4. HA_Proactive_Service 객체가 생성된 후에 구현해준 virtual void addresses(...) 함수가 호출되면서 첫번째 인자인 const ACE_INET_Addr& remote로 peer의 주소가 전달됩니다.
  5. ACE_INET_Addr& remote 객체로 ip 및 port를 문자열 형태로 얻어냅니다.
const int max_addr_len = 32;
// ip와 port
char ip_port[max_addr_len] = {0,};
remote.addr_to_string(ip_port, max_addr_len);

// ip만
char ip[max_addr_len] = {0,};
remote.get_host_addr(ip, max_addr_len);

추가사항.
this->pass_addresses(true); 호출해주지 않고 open함수에서 인자를 넣어주는 방법도 있습니다.
아래와 같이 하면 됩니다. sphawk님이 댓글로 알려 주셨습니다.

ACE_Asynch_Acceptor<ServiceHandler> acceptor;
acceptor.open(listen_addr,
                                  0,        // bytes_to_read
                                  true,        // pass_addresses
                                  ACE_DEFAULT_BACKLOG,
                                  1,        // reuse_addr
                                  0,        // proactor
                                  1,        // validate_new_connection
                                  1,        // reissue_accept
                                  1024))    // number_of_initial_accepts



by 자바워크 | 2008/11/09 20:45 | Programming | 트랙백 | 덧글(2)

트랙백 주소 : http://javawork.egloos.com/tb/2130130
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by sphawk at 2008/11/19 01:59
Asynch_Acceptor에서 open함수의 pass_addresses를 true로 주면
나중에 handle_accept안에서 addresses함수를 호출해줍니다.
Commented by 자바워크 at 2008/11/19 10:18
Asynch_Acceptor의 open 함수에도 pass_addresses를 세팅해주는 인자가 있었군요. 그 방법이 더 깔끔하겠네요. ACE를 보다보면 대부분의 클래스들이 open 함수에서 종합적으로 설정해주고 따로 설정하는 함수들도 모두 제공하던데, Asynch_Acceptor 도 마찬가지 였네요.
좋은 정보 감사합니다.

:         :

:

비공개 덧글

<< 이전 페이지     다음 페이지 >>