[완료] non blocking mode에서 select()이용 send buffer 감지 하는 방법
글쓴이: binalee / 작성시간: 금, 2007/03/30 - 7:49오후
안녕하세요.
제목 그대로 non blocking mode에서 select()이용 send buffer 감지 하는 방법을 알고 싶습니다.
주로 select()는 패킷을 받을 때만 사용해봐서요..
현재 하는 작업이 30KB정도의 데이타를 1초에 30번씩 전송하는 것인데 SEND BUFFER에 다 쓰지 못하면 EINVAL이
리턴 되잖아요.
그때 저는 sleep()을 이용 버퍼가 비기를 기다렸다가 재전송하는 무식한 방법을 이용하고 있습니다. -_-;
지금 꽤 오랜시간 send()함수 시 blocking이 되면 처리하는 알고리즘을 찾고 있는데 select를 이용할 수 있다는
tip을 얻긴 했는데 예제가 없으니 막막하네요.
혹시 대략적인 사용법이라도 알려주시면 감사하겠습니다.
Forums:
#include <sys/select.h> int
보시다시피 select 함수는 readfds, writefds, errorfds를 입력 받습니다. 패킷을 수신할때 select를 사용하셨다면 readfds만 셋팅하고 사용하셨겠죠. 송신할때 사용하는 방법은 writefds를 셋팅하고 select를 호출하시면 됩니다. 나머지 작업들(어떤 fd가 writable한지 확인 등)은 수신할때 사용하셨던 방법과 동일하게 하시면 됩니다.
단, select가 writable이라고 리턴했다고해서 프로그래머가 요청하는 전송량을 모두 전송 할 수 있는것은 아닙니다. 예를들어, 소켓의 send buffer가 2048 바이트의 사용가능한 공간이 있어서 select가 writable로 리턴했는데 프로그래머 8192 바이트를 write하면 블럭되는거죠. 그래서 non-blocking mode와 함께 select를 사용해야 합니다.
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
아~ 그렇군요
사용 가능한 사이즈는 알수가 없는 거군요..
정말 궁금했는데 답변 주셔서 감사합니다.
좋은 하루 되세요...
감사합니다
1:1 통신인 경우라면,
1:1 통신인 경우라면, 굳이 nonblocking socket과 select()를 사용하지 않아도,
그냥 blocking mode에서 setsockopt()함수의 SO_SNDTIMEO 옵션으로 타임아웃을 지정하면,
타임아웃에 걸리면 EAGAIN 에러로 리턴해줍니다. 간단하게 작성할거면 이게 더 편리합니다.
만일 1:n 의 통신이라면 어쩔 수 없이 nonblocking, select(), buffer queue까지 구현해야 합니다.
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.
========================================
* The truth will set you free.
댓글 달기