ACE_Proactor에서 ACE_Message_Block을 어떻게 관리해야 하나요?

97 views
Skip to first unread message

삼겹이

unread,
Jun 5, 2008, 3:06:01 AM6/5/08
to kaug
안녕하세요 ^^
이번에 ACE_Proactor를 사용하는 프로젝트를 하려고 준비중입니다.
처음 사용해보는지라 많은것이 부족하내요 ㅠㅠ;;

일단 ACE_Proactor의 기본 흐름을 써보겠습니다
peer랑 연결이 구축되면 ACE_Service_Handler::open( ACE_HANDLE,
ACE_Message_Block & ) 함수가 호출되고
이 함수 안에서 ACE_Message_Block* mb; ACE_NEW_NORETURN (mb,
ACE_Message_Block (ACE_DEFAULT_CDR_BUFSIZE));
을 사용해서 ACE_Message_Block를 할당하고 바로 read를 호출해서 peer의 응답을 기다립니다.
패킷을 받으면 ACE_Service_Handler:: handle_read_stream함수가 호출되고 패킷내용을 분석 처리하

write를 하면 ACE_Service_Handler::handle_write_stream 이함수가 불려지며 활당한
ACE_Message_Block을
해제 하게끔 되어 있더라구요 (제가 이해한것이 맞는지 확인할겸해서요 틀렸으면 알려주세요^^)

질문
1) ACE_Service_Handler::open( ACE_HANDLE, ACE_Message_Block & )
안에서 할당하는 ACE_Message_Block를 매번 new로 할당 해도 되는지요
아니라면 어떻게 관리는 해야 하는지

2)ACE_Service_Handler:: handle_read_stream 함수에서 peer가 보낸 패킷을 처리해야 할거같은데

어떻게 해야할지 난감합니다. ㅠㅠ;
일단 연결이 끊어지는걸 감지하는건 책에 나와있구. 그외 패킷을 완전하게 받았는지, 또는 패킷을 덜받았는지,
또는 패킷을 더 받았는지 검사를해서 패킷을 잘라내야 할꺼 같은데 이러한 작업을 어떻게 해야 할지
모르겠습니다.

3)ACE_Service_Handler::handle_write_stream 함수에서는 write한 패킷이 완전히 보내졌는지를
검사해서
안보내진 부분을 재전송 해줘야 할꺼 같은데 그 방법도 잘 모르겠내요

4) 좋은 예제를 볼만한곳이 있을까요?

Javawork

unread,
Jun 8, 2008, 10:23:47 PM6/8/08
to kaug
1) APG책(ACE 프로그래머 가이드)에 나오는 Proactor 예제 보시면 매번 할당 받는 식으로 되어 있습니다. 이렇게 하
셔도 되고 ACE_Message_Block pool을 만들어서 쓰셔도 됩니다. pool을 만들어서 사용하는 방법은
http://javawork.springnote.com/pages/971284 에 밑에 쯤에 첨부되어 있는 소스 참고하시면 될
것 같습니다.

2) 완전하게 받은 것인지 체크하는 방법은 어떤 함수가 있는 것은 아니고 패킷 구조를 잘 정의 하셔서 체크하셔야 합니다. 예를
들면 |패킷타입|패킷길이|데이터...| 이런식으로 정의를 하셔서 패킷 길이만큼 다 받은 것인지 체크하시면 됩니다.

3) 재전송 처리는 아래와 같이 하시면 됩니다.
ACE_Service_Handler::handle_write_stream(const
ACE_Asynch_Write_Stream::Result& result)
{
size_t remainLength = result.bytes_to_write() -
result.bytes_transferred()
if (remainLength > 0)
{
writer_.write(result.message_block(), remainLength);
}
.
.
}

4) 국내에 출판된 APG, C++NP 1, 2 에 나와있는 예제와 ACE배포본의 examples, apps 폴더에 있는 예제
를 참고하셔야 할 것 같습니다. 그 이외에는 딱히 참고할만한 예제를 본적이 없습니다.
Reply all
Reply to author
Forward
0 new messages