select() 에 관한 질문
글쓴이: digitie / 작성시간: 화, 2008/07/08 - 11:31오후
네트워크 통신 프로그램을 제작하고 있습니다. 허나 기초가 부족해서 많이 고생하고 있는데요.
현재 문제는 아래와 같습니다.
1. 보내고 받을 때 타임아웃(ms단위)을 지정해서 타임아웃 시 적절한 동작을 할 수 있어야 한다.
2. 기존의 send, recv 함수에서 간단하게 파라미터를 바꿈으로써 타임아웃 기능을 추가할 수 있어야 한다. (즉, 기존 코드를 많이 뜯어고치지 않아야 한다)
개인적으로 생각할 때는 non-blocking socket + select()로 해결할 수 있을꺼라 생각했는데 잘 안되서 질문 드립니다.
현재 코드 구조는 다음과 같습니다.
/* 소켓은 이미 non-blocking 으로 설정 완료 */ recv_with_timeout(s, buf, len, timeout) { for(;;) { rtn = select(s, &readfd, null, null, timeout); if(rtn > 0) { rcv_len = recv(s, buf, len, 0); if(rcv_len > 0) { 덜받았으면 다받을 때까지 루프돌기; len 만큼 받았으면 리턴; } } } }
이런 구조입니다. 이 함수가 기존의 블로킹 send 콜을 대체해서 들어가게 됩니다.
근데 정상적으로 동작하지 않는군요. 제 생각에는 select() 이전에 descriptor에 변화가 생기면 select()에서 감지를 못하는 것 같은데...
위의 코드가 맞는지, 다른 적절한 방법이 어떤게 있는지 답변 부탁드립니다.
즐거운 하루 되세요 :)
ps. 너무 기초적인게 빠진 질문이라면 대략적인 힌트라도 부탁드립니다.
Forums:
댓글 달기