본문 바로가기

IT Device Game

창고-접속시간 타임아웃을 위한 NONBLOCK connect 구현


서비스로 저희딸 사진을 ㅡㅡ;;;;  저렇게 포즈 설정으로 잡고 사진 찍어 달라 하더이다. 참고로 이제 30개월입니다. ㅡㅡ;;;;; 왠지 걱정이~


 

옛날 사진



5년 넘게 사용해오던 홈페이지를 접기로 결정했습니다....
아쉽긴 하지만 시대에 따라가기엔 버거워서 운영을 접고 지인의 초대장을 협박으로 구해서 티스토리로 넘어오게 됐습죠~.

 

무엇보다 제 생각에 가장 큰 원인은 개인홈페이지의 시대가 가버렸습니다 ^^;;;;
모바일 환경에 맞게 일부 수정도 해보았지만 제로보드의 한계 랄까요~...

그러다 창고 삼아 뒤적뒤적 예전 글들을 옮겨오고 있습니다. 그러다 보니 시대에 많이 뒤떨어진 포스트들도 보시게 될텐데~ 검색으로 들어오셨다면 너그러이 용서를 바라며~ 발행을 보고 오셨다면 제가 손가락이 실수로 발행을 누른탓입니다.

예전글들은 발행버튼은 안쓰려고 하는데 가끔 실수를 합니다.

자 변명은 이쯤하고 역시 불친절한 설명글로 대체 합니다.


09.08.2008 23:25 

같은 직장 동료가 작성한 함수 인데 아이디어가 탁월해서 소개한다.
UNIX에서 아래와 같은 함수를 connect 함수 대신 사용하여 해당 초(nsec) 내에 접속이 안되는 경우 접속오류를 내도록 하는 함수 .

이를 위해서는 소켓 접속전 잠시  소켓을 non Blocking  상태로 변환하였다가 접속이후 다시 Blocking 소켓으로 전환한다. 이렇게 하는 이유는  Select를 통해 접속타임아웃을 체크하기 위해서 이다.

int fconnect_nonb(int sockfd, struct sockaddr * saptr, socklen_t salen, int nsec)

{

    int             flags, n, error;
    socklen_t       len;
    fd_set          rset, wset;
    struct timeval  tval;

   // NONBLOCK 으로 변경
    flags = fcntl(sockfd, F_GETFL);
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);

    error = 0;

    if ( (n = connect(sockfd, saptr, salen)) < 0)

        if (errno != EINPROGRESS)

            return(-1);


    if (n == 0)

        goto done;  /* connect completed immediately */

 

    FD_ZERO(&rset);
    FD_SET(sockfd, &rset);\
    wset = rset;
    tval.tv_sec = nsec;
    tval.tv_usec = 0;

    if ( (n = select(sockfd+1, &rset, &wset, NULL,

                     nsec ? &tval : NULL)) == 0) {

        close(sockfd);      /* timeout */
        errno = ETIMEDOUT;
        return(-1);

    }

 

    if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {
        len = sizeof(error);
        if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
            return(-1);         /* Solaris pending error */
    }


done:

    if (error) {
        close(sockfd);      /* just in case */
        errno = error;
        return(-1);
    }
     //원환경인 BLOCKING MODE 복구
    fcntl(sockfd, F_SETFL, flags );
    return(1);


반응형