글 수 48
2007.02.28 10:35:25 (*.82.68.226)
52286
poll() 함수에 대한 말씀을 조금 더 드리고 가도록 하겠습니다. 이렇게 글을 작성하는 이유는 제가 올려 드린 통신 라이브러리 중에 아래와 같은 내용이 있습니다.
poll() 호출 후에 자료가 수신이 되면 on_poll_in() 함수를 호출하게 됩니다. on_poll_in() 함수에서는 프로그램에서 지정한 버퍼의 크기만큼 수신 자료를 받아 오는데, 만일 수신 버퍼 보다 더 많은 양의 데이터가 수신되었다면 어떻게 해야 할까요? 아래와 같이 while 문을 사용하여 모두 수신을 해야 할까요?
static void on_poll_in( rs232_t *sender) { char buff[__MAX_BUFF_SIZE]; int sz_read; while( 1 ) { sz_read = read( sender->fd, buff,__MAX_BUFF_SIZE); if ( 0 >= sz_read) // 읽어 들일 자료가 없다면 loop 밖으로 break; else sender->on_read( sender, buff, sz_read); // 읽어 들인 자료를 통신 객체에게 전달 } }
이 포스트에는 동영상이 준비되어 있습니다. 동영상을 보시려면 를 클릭하여 주십시오. |
동영상에서 보시는 바와 같이 수신된 자료가 프로그램에서 준비한 버퍼 보다 크더라도 poll()에서 읽지 못한 자료가 있다면 계속 POLL_IN을 알려 주기 때문에 계속해서 수신받은 자료를 읽어 들일 수 있다는 말씀이 되겠습니다.
즉, 아래와 같이 while 문이 없어도, 그리고 읽어 들이는 버퍼가 수신된 자료보다 작아서 수신 자료를 모두 읽지 않고 POLL_IN 처리 루틴을 빠져 나와도 다음 poll()의 POLL_IN에 의해 계속해서 자료를 읽어 들일 수 있습니다.
static void on_poll_in( rs232_t *sender) { int sz_read; if ( NULL == sender->on_read) { sz_read = read( sender->fd, __net_buff,__MAX_BUFF_SIZE); if ( 0 >= sz_read) // 자료 읽기에 실패했다면 에러 처리 on_poll_err( sender) } else sender->on_read( sender); // 자료 읽어 들이는 함수 호출 }