CSock - connect timeout class


This article was contributed by Seung Kyung, Lee.

Environment: VC6, WindosNT4 SP3

ÀÌ Å¬·¡½º´Â MFCÀÇ CSocket class¸¦ ÀÌ¿ëÇÏ´Â °æ¿ì¿¡ ŸÀӾƿôüũ°¡ ºÒ°¡´ÉÇÑ ¹®Á¦¸¦ ÇØ°áÇØ Áִ Ŭ·¡½º ÀÌ´Ù. CSocketÀº ¼ÒÄÏ¿¬°á½Ã ¹®Á¦°¡ ¹ß»ýÇÏ¸é ¿øÇÏ´Â ½Ã°£¿¡ ¸®ÅÏÇØ ÁÖÁö ¸øÇϹǷΠÇÁ·Î±×·¥ÀÇ È¿À²À» ¶³¾î ¶ß¸°´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ CSock¸¦ »ç¿ëÇϸé Á¤È®ÇÏ°Ô ¿øÇÏ´Â ½Ã°£µ¿¾È¿¡ ¿¬°áÀÌ µÇÁö ¸øÇÏ¸é ¹Ù·Î ¸®ÅÏÇÏ¿© ÁֹǷΠÇÁ·Î±×·¥ÀÇ Á¤È®¼ºÀ» ³ôÀÏ ¼ö ÀÖ´Ù. CSock´Â MFC CSocket class¿¡¼­ ConnectHelper¸¦ ¿À¹ö¶óÀ̵ùÇØ¼­ ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ¿´´Ù.



/// CSocket modify - timeout module.
BOOL CSock::ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen)
{
	if (m_pbBlocking != NULL)
	{
		WSASetLastError(WSAEINPROGRESS);
		return  FALSE;
	}

	m_nConnectError = -1;

	if (!CAsyncSocket::ConnectHelper(lpSockAddr, nSockAddrLen))
	{
		if (GetLastError() == WSAEWOULDBLOCK)
		{
	// Insert....
			CTime		curt, st;
			CTimeSpan	span(0, 0, 0, m_nTimeOut);

			st = CTime().GetCurrentTime();
	//.......
			while (PumpMessages(FD_CONNECT))
			{
				if (m_nConnectError != -1)
				{
					WSASetLastError(m_nConnectError);
					return (m_nConnectError == 0);
				}
	// Insert....
				curt = CTime().GetCurrentTime();
				if(curt > (st+span))
					return FALSE;
	//..............
			}
		}
		return FALSE;
	}
	m_Kill = FALSE;
	return TRUE;
}


Download demo & source project - 36 Kb

Date Posted: April February 26, 1999