2008년 11월 09일
ACE Proactor에서 peer의 ip알아내기
ACE 프로그래머 가이드(APG)의 8장에 나와있는 Proactor 예제를 기준으로 설명하겠습니다. APG가 없으신 분은 ACE 배포본의 ACE_wrappers/examples/APG/Proactor/ 에 나와있는 예제를 참고하시면 됩니다.
다음은 클래스 내에서 구현된 예제 입니다. 다른 함수는 생략하고 관련 함수만 넣었습니다.
추가사항.
this->pass_addresses(true); 호출해주지 않고 open함수에서 인자를 넣어주는 방법도 있습니다.
아래와 같이 하면 됩니다. sphawk님이 댓글로 알려 주셨습니다.
다음은 클래스 내에서 구현된 예제 입니다. 다른 함수는 생략하고 관련 함수만 넣었습니다.
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);
}
};
- HA_Proactive_Acceptor 클래스에서 virtual HANDLER* make_handler() 함수를 구현합니다.
- 구현한 make_handler() 함수에서 this->pass_addresses(1) 함수를 호출합니다.
- HA_Proactive_Service 클래스에서 virtual void addresses(...) 함수를 구현합니다.
- HA_Proactive_Service 객체가 생성된 후에 구현해준 virtual void addresses(...) 함수가 호출되면서 첫번째 인자인 const ACE_INET_Addr& remote로 peer의 주소가 전달됩니다.
- 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)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
나중에 handle_accept안에서 addresses함수를 호출해줍니다.
좋은 정보 감사합니다.