TCPClient.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "stdafx.h"
  2. #include "kernel.h"
  3. #include "ThreadPool.hpp"
  4. #include <strsafe.h>
  5. #include "TCPClient.h"
  6. #include "Client2SrvType.h"
  7. const int SOCK_TCP = SOCK_STREAM-1;
  8. const int SOCK_UDP = SOCK_DGRAM-1;
  9. const int AF_IPV4 = 0;
  10. const int AF_IPV6 = 1;
  11. CTCPClient* CTCPClient::m_pTcpClient[TCPCLIENTNUM] = {NULL};
  12. CTCPClient::CTCPClient()
  13. {
  14. m_nMode = AF_IPV4;
  15. m_nSockType = SOCK_TCP;
  16. m_SocketClient.SetInterface(this);
  17. m_bSocket = FALSE;
  18. }
  19. CTCPClient::~CTCPClient()
  20. {
  21. }
  22. void CTCPClient::Release()
  23. {
  24. //chn add
  25. for( int i=0;i<TCPCLIENTNUM;i++ )
  26. {
  27. if( m_pTcpClient[i])
  28. delete m_pTcpClient[i];
  29. m_pTcpClient[i] = NULL;
  30. }
  31. }
  32. // 静态成员函数,提供全局访问的接口
  33. CTCPClient* CTCPClient::GetInstancePtr( int iTCPIndex )
  34. {
  35. if( NULL == m_pTcpClient[iTCPIndex] )
  36. {
  37. m_pTcpClient[iTCPIndex] = new CTCPClient();
  38. }
  39. return m_pTcpClient[iTCPIndex];
  40. }
  41. BOOL CTCPClient::Connection(LPCTSTR strAddr, LPCTSTR strPort)
  42. {
  43. int nFamily = (m_nMode == AF_IPV4) ? AF_INET : AF_INET6;
  44. if ( !m_SocketClient.StartClient(NULL, strAddr, strPort, nFamily, (m_nSockType+1) ) )
  45. {
  46. m_bSocket = FALSE;
  47. //LOG4C((LOG_NOTICE, "连接失败 [%s, %s, %d, %d]",strAddr, strPort, nFamily, (m_nSockType+1)));
  48. //MessageBox(NULL, _T("连接服务器失败!"), "提示", MB_ICONSTOP);
  49. return FALSE;
  50. }
  51. else
  52. {
  53. m_bSocket = TRUE;
  54. CSocketHandle* pSH = (CSocketHandle *)m_SocketClient;
  55. pSH->m_nPendingSize = 0;
  56. memset(pSH->m_PendingBuffer, 0, SOCKET_BUFFSIZE);
  57. SetupMCAST();
  58. return TRUE;
  59. }
  60. }
  61. void CTCPClient::DisConnection()
  62. {
  63. m_SocketClient.Terminate();
  64. }
  65. bool CTCPClient::SetupMCAST()
  66. {
  67. const TCHAR szIPv4MCAST[] = TEXT("239.121.1.2");
  68. const TCHAR szIPv6MCAST[] = TEXT("FF02:0:0:0:0:0:0:1"); // All Nodes local address
  69. bool result = false;
  70. if ( m_nSockType == SOCK_UDP )
  71. {
  72. if ( m_nMode == AF_IPV4 ) {
  73. result = m_SocketClient->AddMembership(szIPv4MCAST, NULL);
  74. } else {
  75. result = m_SocketClient->AddMembership(szIPv6MCAST, NULL);
  76. HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
  77. hr = hr;
  78. }
  79. }
  80. return result;
  81. }
  82. void CTCPClient::GetAddress(const SockAddrIn& addrIn, CString& rString) const
  83. {
  84. TCHAR szIPAddr[MAX_PATH] = { 0 };
  85. CSocketHandle::FormatIP(szIPAddr, MAX_PATH, addrIn);
  86. rString.Format(_T("%s : %d"), szIPAddr, static_cast<int>(static_cast<UINT>(ntohs(addrIn.GetPort()))) );
  87. }
  88. ///////////////////////////////////////////////////////////////////////////////
  89. // 实现ISocketClientHandler的通信方法
  90. void CTCPClient::OnThreadBegin(CSocketHandle* pSH)
  91. {
  92. ASSERT( pSH == m_SocketClient );
  93. (pSH);
  94. CString strAddr;
  95. SockAddrIn sockAddr;
  96. m_SocketClient->GetSockName(sockAddr);
  97. GetAddress( sockAddr, strAddr );
  98. InitializeCriticalSection(&pSH->m_hClient2SrvSection);
  99. //AppendText( _T("Client Running on: %s\r\n"), strAddr);
  100. }
  101. void CTCPClient::OnThreadExit(CSocketHandle* pSH)
  102. {
  103. ASSERT( pSH == m_SocketClient );
  104. DeleteCriticalSection( &pSH->m_hClient2SrvSection );
  105. (pSH);
  106. }
  107. void CTCPClient::OnDataReceived(CSocketHandle* pSH, const BYTE* pbData, DWORD dwCount, const SockAddrIn& addr)
  108. {
  109. ASSERT( pSH == m_SocketClient );
  110. (pSH);
  111. if( !m_SocketClient->IsOpen() ) return;
  112. m_TcpParse.ProcessData( pSH, pbData, dwCount );
  113. }
  114. void CTCPClient::OnConnectionDropped(CSocketHandle* pSH)
  115. {
  116. ASSERT( pSH == m_SocketClient );
  117. (pSH);
  118. TRACE(_T("======连接服务器断开.\r\n"));
  119. m_bSocket = FALSE;
  120. //AppendText( _T("Connection lost with server. Need restart.\r\n") );
  121. }
  122. void CTCPClient::OnConnectionError(CSocketHandle* pSH, DWORD dwError)
  123. {
  124. ASSERT( pSH == m_SocketClient );
  125. (pSH);
  126. _com_error err(dwError);
  127. m_bSocket = FALSE;
  128. //AppendText( _T("Communication Error:\r\n%s\r\n"), err.ErrorMessage() );
  129. }
  130. BOOL CTCPClient::SendNoticeToServer( int iCmd,int iOperateType,CString sUserName,CString sUID,int iVarID )
  131. {
  132. if( m_bSocket )
  133. return m_TcpParse.SendNoticeToServer( m_SocketClient,iCmd,iOperateType,sUserName,sUID,iVarID );
  134. else
  135. return FALSE;
  136. }
  137. BOOL CTCPClient::GetServerVer()
  138. {
  139. if( m_bSocket )
  140. return m_TcpParse.GetServerVer( m_SocketClient );
  141. else
  142. return FALSE;
  143. }
  144. BOOL CTCPClient::TestAlarm()
  145. {
  146. if( m_bSocket )
  147. return m_TcpParse.TestAlarm( m_SocketClient );
  148. else
  149. return FALSE;
  150. }
  151. BOOL CTCPClient::ConfigAlarm( CString sUID,int iVarID,int iStatus,int iAlarmIndex )
  152. {
  153. if( m_bSocket )
  154. return m_TcpParse.ConfigAlarm( m_SocketClient,sUID,iVarID,iStatus,iAlarmIndex );
  155. else
  156. return FALSE;
  157. }