select() 에 관한 질문

digitie의 이미지

네트워크 통신 프로그램을 제작하고 있습니다. 허나 기초가 부족해서 많이 고생하고 있는데요.

현재 문제는 아래와 같습니다.

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. 너무 기초적인게 빠진 질문이라면 대략적인 힌트라도 부탁드립니다.