'socket'에 해당되는 글 4건

  1. socket connect timeout (2)
  2. http socket client
  3. 유용한 소켓 강좌
  4. 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);
}


http socket client

급하게 필요해 날림으로 하루만에 뚝딱 만들었습니다.
아주 기본적인 동작만 합니다.

청크드 모드는 아직 구현되지 않았습니다.


-- History -------------------------------------------------------------------------

2006.08.31 : 생성 by newtype 
2006.11.24 : CHttpSocket::Request      메모리 릭 수정.
2007.03.31 : CHttpReqHeader::toString  메모리 덮어 쓰는 버그 수정
                 Windows에서도 컴파일 되게 수정
2007.05.29 : Connection 시점에도 timeout 적용(nonblocking socket사용)
2011.05.13 : Transfer-Encoding: chunked 모드 지원

-----------------------------------------------------------------------------------

사용예 보기


헤더 파일 보기


소스 파일 보기




유용한 소켓 강좌

** 원본 소켓 강좌 보기 **


----  이하 퍼온 강좌  ---------

Network의 기본


소켓 API


I/O 모델


POSIX Thread


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]