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]
[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]
반응형
'Dev > C, C++' 카테고리의 다른 글
MFC용 ADO클래스 (버전업) (2) | 2006.07.24 |
---|---|
소스상에서 lib링크 하기 (0) | 2006.07.07 |
LPTSTR 자료형의 문자열 치환 (1) | 2004.07.28 |
UTF8, 유니코드, 아스키 파일의 구별 (0) | 2004.01.03 |
항상 위 효과 내기 (0) | 2003.07.18 |