'timeout'에 해당되는 글 3건

  1. socket connect timeout (2)
  2. console 끊어지지 않게 하기
  3. socket 타임아웃처리

socket connect timeout


connection 할때 timeout 처리에 관해 찾아 보는 중.
nonblocking socket을 이용한 Rechard stevens의 소스가 있더군요.

Rechard stevens 소스 보기



예전에 포스팅 한 http socket client 에 적용하면서 windows 버전으로도 만들어 봤습니다.

int CHttpSocket::connect_nonb(int sockfd, const struct sockaddr *saptr, socklen_t salen, struct timeval tval)
{
    int                flags, n, error;
    socklen_t        len;
    fd_set            rset, wset;

#ifdef WIN32
    int nonblocking =1;
    ioctlsocket(sockfd, FIONBIO, (unsigned long*) &nonblocking);
#else
    flags = fcntl(sockfd, F_GETFL, 0);
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
#endif

    error = 0;
    if ( (n = connect(sockfd, (struct sockaddr *) saptr, salen)) < 0)
    {
#ifdef WIN32
        errno = WSAGetLastError();
#endif
        if (errno != EINPROGRESS && errno!= EWOULDBLOCK)
        {
            return(-1);
        }
    }

    /* Do whatever we want while the connect is taking place. */

    if (n == 0)
        goto done;    /* connect completed immediately */

    FD_ZERO(&rset);
    FD_SET(sockfd, &rset);
    wset = rset;

    if ( (n = select(sockfd+1, &rset, &wset, NULL,
                     ((tval.tv_sec>0) || (tval.tv_usec>0))? &tval : NULL)) == 0)
    {
        close(sockfd);        /* timeout */
        errno = ETIMEDOUT;
        return(-1);
    }

    if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset))
    {
#ifndef WIN32
        len = sizeof(error);
        if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
            return(-1);            /* Solaris pending error */
#endif
    } else
        return(-1); //err_quit("select error: sockfd not set");

done:
#ifdef WIN32
    nonblocking =0;
    ioctlsocket(sockfd, FIONBIO, (unsigned long*) &nonblocking);
#else
    fcntl(sockfd, F_SETFL, flags);    /* restore file status flags */
#endif

    if (error) {
        close(sockfd);        /* just in case */
        errno = error;
        return(-1);
    }
    return(0);
}


console 끊어지지 않게 하기

원격지 console에 접속해서 작업을 하다가
잠깐 다른 생각을 하면 접속이 끊어 집니다.

서버 설정에 따라 Timeout 되어 접속 이끊어지는 것인데,

$ export TMOUT=


이렇게만 해주면 접속이 끊어지지 않네요.

/etc/profile

이란 파일에 보면 TMOUT 값이 설정되어 있는데..
이 내용을 변경하는 재설정하는 명령입니다.

영구적으로 변경하려면, 위 파일의 내용을 수정하면 됩니다.

HP 장비에서 확인했습니다.

socket 타임아웃처리

Unix socket 에서 타임아웃 처리를 하는 방법중에 select를 이용한 방법입니다.

[CODE type=c++]
/********************************************************************
* 데이타를 보낸다.
*
* return : int Error Code
* parameter :
* [in] int sock : 연결할 소켓 핸들
* [in] void *data : 전송할 데이타
* [in] unsigned int size : 데이타의 크기
* [in] int timeout : 타임아웃 처리를 할 시간
********************************************************************/
int gaSend(int sock, void *data, unsigned int size, int timeout)
{
    int sockNum = sock +1;
    fd_set sockSet;
    struct timeval selTimeout = { timeout, 0 }; /* 초, 마이크로초 */
    int result;

    if ( sock == 0 )
        return CONNECTION_REFUSED;

    FD_ZERO(&sockSet);
    FD_SET(sock, &sockSet);

    result = select( sockNum, NULL, &sockSet, NULL, &selTimeout );
    if ( result == 0 )
    {
        return CONNECTION_TIMEOUT;
    }
    else if ( result ==-1 )
    {
        return CONNECTION_REFUSED;
    }

    result = socketSend( sock, (char*)data, size) ;
    if ( result < 0 )
    {
        return CONNECTION_REFUSED;
    }

    return SUCCESS;
}

/********************************************************************
* 데이타를 받는다.
*
* return : int Error Code
* parameter :
* [in] int sock : 연결할 소켓 핸들
* [in] void *data : 전송받을 데이타
* [in] unsigned int size : 데이타의 크기
********************************************************************/
int gaRecive(int sock, void *data, unsigned int size, int timeout)
{
    int sockNum = sock +1;
    fd_set sockSet;
    struct timeval selTimeout = { timeout, 0 };
    int result;

    if ( sock == 0 )
        return CONNECTION_REFUSED;

    FD_ZERO(&sockSet);
    FD_SET(sock, &sockSet);

    result = select( sockNum, &sockSet, NULL, NULL, &selTimeout );
    if ( result == 0 )
    {
        return CONNECTION_TIMEOUT;
    }
        else if ( result ==-1 )
    {
        return CONNECTION_REFUSED;
    }


    result = socketRecv(sock, (char*)data, size, timeout);
    if( result < 0 )
    {
        return CONNECTION_REFUSED;
    }

    return SUCCESS;
}
[/HTML][/CODE]