네트워크 하트비트 패키지 처리

이전에 Socket 프로그래밍을 배울 때 마이크로소프트의 API 함수를 간단하게 호출했을 뿐 네트워크의 이상 처리를 고려하는 경우는 드물었다.실제 프로젝트에서 인터넷 이상은 반드시 고려해야 한다.
네트워크 차단 오프라인 이상 처리: HeartBeat 네트워크 하트비트 패키지
한 번은 개인적인 이해입니다. 인터넷 심장 박동 패키지의 처리 방식은 두 가지가 있습니다.
방식1: 터미널이 자발적으로 시작하고 서버가 각 터미널의 마지막 패키지 시점을 기록한 다음에 모든 클라이언트를 정시에 스캔합니다. 만약에 스캔 시점과 마지막 패키지 시점의 간격이 시간 초과 시간보다 크면
시간 초과 사건이 발생하다.서버가 클라이언트 정보 기록을 지웁니다.
방식2: 서버가 자발적으로 시작하고 서버가 정시에 하트비트 패키지를 보내며 클라이언트가 몇 번이나 응답하지 않았는지 기록하면 시간 초과 사건이 발생한다고 생각한다.여러 번 응답을 받지 못했지만 일정 범위 내에서 응답을 받았다면,
기록을 지웁니다.응답이 일정량에 도달하지 않으면 기본 네트워크 이상이 발생합니다.
typedef struct tagSocketPacket
{  
	   CString tagStrDeviveID;
	   SOCKET  tagSocket;
	   SYSTEMTIME  tagRecTimer;
}SocketPacket,*pSocketPacket;


typedef vector<SocketPacket> vectorSocketPacket;
void HeartBeat(SOCKET socket)
{
	SYSTEMTIME timer;
    SocketPacket  socketPacket;
    vectorSocketPacket::iterator it;
    for (it = myVectorPacket.begin(); it != myVectorPacket.end(); it++)
	   {
		if (socket == (*it).tagSocket)
		{
			GetSystemTime(&timer);
			socketPacket = (*it);
			socketPacket.tagRecTimer = timer;
			myVectorPacket.erase(it); 
			VectorPacket_insert(socketPacket);
		 	break;    
		}
	}	
}

void VectorPacket_insert(SocketPacket socketPacket)
{
	myVectorPacket.push_back(socketPacket);
}

BOOL IsTimeOuts(SYSTEMTIME Timer)
{
	SYSTEMTIME sysTimer;
	GetSystemTime(&sysTimer);
	DWORD times1, times2;
	
	times1 = Timer.wHour*3600+Timer.wMinute*60+Timer.wSecond;
	times2 = sysTimer.wHour*3600+sysTimer.wMinute*60+sysTimer.wSecond;
	
	if (times2 - times1 > TIMEOUTS)
	{
		return TRUE;
	}	
	return FALSE;
}

좋은 웹페이지 즐겨찾기