TCPClient.cpp 3.6 KB

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