반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

폴크(FOLC)

MFC 테크닉 - 통신 Socket ( Heartbeat - Send/Recv ) 본문

C, C++, MFC/C, C++, MFC 테크닉

MFC 테크닉 - 통신 Socket ( Heartbeat - Send/Recv )

folcjin 2021. 12. 7. 20:19
728x90
반응형

# TCP/IP 로 통신을 진행하는 상태 확인
   > 1:1, 1:N, N:1
   > 통신 연결을 사용하고 있는 PC 의 socket 에 직접 데이터를 전달
      - 약속된 파라미터 값을 전달

# Socket 에서 약속된 파라미터 값을 설정된 시간 동안 데이터 송/수신이 없는 경우 socket 을 제거하고 연결 상태를 해제 시킨다. ( 리소스 삭제 )
   > 별도의 Thread 로 파라미터를 송신, OnReceive 에서 파라미터 수신
   > 비 정상 종료로 인해서 socket 을 사용하지 못하는 경우 ( 예외 처리 용 )

   > LanCable 을 제거 했거나 통신 선로 상의 문제가 발생하는 경우 ( 예외 처리 용 )

# 소스 코드 ( CSocket 상속 받은 클래스 )

// 약속된 파라미터 전송 - 3초 간격
UINT CClientSocket::ThreadRun(void *params)

{
   CClientSocket*pThis = (CClientSocket*)params;

   if(pThis != nullptr)
   {
      DWORD dwHBPeriodStartTime = GetTickCount();
      while (1)
      {
         // heart beat 확인 - 수신 데이터
         pThis->ThreadRun(dwHBPeriodStartTime);
      }
   }
   return 0;
}
void CClientSocket::ThreadRun(DWORD &period)
{
   if(3000 < (GetTickCount() - period))
   {
      Send((LPCTSTR)m_strHBMesg, m_strHBMesg.GetLength() * 2);
      period = GetTickCount();
   }
}

// 약속된 파라미터 수신 - 3초 간격
void CClientSocket::OnReceive(int nErrorCode)
{
   CString strMessage = _T("");
   // 전달된 데이터(문자열)가 있을 경우
   TCHAR strBuffer[1024];
   ZeroMemory(strBuffer, sizeof(strBuffer));
   if (0 < Receive(strBuffer, sizeof(strBuffer)))
   {
      strMessage = CString(strBuffer);
      m_dwHBStartTime = GetTickCount();
   }   
   SendMessage(m_hWnd, WM_CLIENT_MSG_RECV, NULL, (LPARAM)((LPCTSTR)strTmp));   
   CAsyncSocket::OnReceive(nErrorCode);
}

// 제한 시간이 지나면 연결 끊김으로 처리 - 20초
void CClientSocket::IsTimeOver()

{
   if(20000 < (GetTickCount() - m_dwHBStartTime))
   {
      SendMessage(m_hWnd, WM_CLIENT_CLOSE, NULL, NULL);
   }
}

728x90
반응형
사업자 정보 표시
사업자 등록번호 : -- | TEL : --