2009년 8월 18일 화요일

CSocket의 Connect시의 타임아웃 설정


CAsyncSocket m_Socket;
int port = _ttoi(g_UserInfo.ServerPort);
m_Socket.Create(0,SOCK_STREAM,0);

fd_set fdset;
FD_ZERO( &fdset );
FD_SET( m_Socket.m_hSocket, &fdset );
timeval timeOut;
timeOut.tv_sec = 3;
timeOut.tv_usec = 0;


// connect를 호출하긴 하지만 CAsync인 관계로 블럭되지 않고 통과

int ret = m_Socket.Connect(g_UserInfo.ServerIP,port);


if(ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)

return FALSE;

// 여기서 3초간 블럭

if(select(0, NULL, &fdset, NULL, &timeOut) == SOCKET_ERROR)

return FALSE;

// 3초 후에 블럭이 플렸다면 현재 소켓이 열려 있는지 확인

if ( !FD_ISSET( m_Socket.m_hSocket, &fdset ) )

{

/// 3초만에 안열린 것이고
closesocket(m_Socket.m_hSocket);
m_Socket.m_hSocket = INVALID_SOCKET;
CString strMessage;strMessage.LoadString(IDS_CONNECTFAIL);
AfxMessageBox(strMessage);
return FALSE;

}

댓글 없음:

댓글 쓰기