123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #include "stdafx.h"
- #include "kernel.h"
- #include "ThreadPool.hpp"
- #include <strsafe.h>
- #include "TCPClient.h"
- #include "Client2SrvType.h"
- const int SOCK_TCP = SOCK_STREAM-1;
- const int SOCK_UDP = SOCK_DGRAM-1;
- const int AF_IPV4 = 0;
- const int AF_IPV6 = 1;
- CTCPClient* CTCPClient::m_pTcpClient[TCPCLIENTNUM] = {NULL};
- CTCPClient::CTCPClient()
- {
- m_nMode = AF_IPV4;
- m_nSockType = SOCK_TCP;
- m_SocketClient.SetInterface(this);
- m_bSocket = FALSE;
- }
- CTCPClient::~CTCPClient()
- {
- }
- void CTCPClient::Release()
- {
- //chn add
- for( int i=0;i<TCPCLIENTNUM;i++ )
- {
- if( m_pTcpClient[i])
- delete m_pTcpClient[i];
- m_pTcpClient[i] = NULL;
- }
- }
- // 静态成员函数,提供全局访问的接口
- CTCPClient* CTCPClient::GetInstancePtr( int iTCPIndex )
- {
- if( NULL == m_pTcpClient[iTCPIndex] )
- {
- m_pTcpClient[iTCPIndex] = new CTCPClient();
- }
- return m_pTcpClient[iTCPIndex];
- }
- BOOL CTCPClient::Connection(LPCTSTR strAddr, LPCTSTR strPort)
- {
- int nFamily = (m_nMode == AF_IPV4) ? AF_INET : AF_INET6;
- if ( !m_SocketClient.StartClient(NULL, strAddr, strPort, nFamily, (m_nSockType+1) ) )
- {
- m_bSocket = FALSE;
- //LOG4C((LOG_NOTICE, "连接失败 [%s, %s, %d, %d]",strAddr, strPort, nFamily, (m_nSockType+1)));
- //MessageBox(NULL, _T("连接服务器失败!"), "提示", MB_ICONSTOP);
- return FALSE;
- }
- else
- {
- m_bSocket = TRUE;
- CSocketHandle* pSH = (CSocketHandle *)m_SocketClient;
-
- pSH->m_nPendingSize = 0;
- memset(pSH->m_PendingBuffer, 0, SOCKET_BUFFSIZE);
- SetupMCAST();
- return TRUE;
- }
- }
- void CTCPClient::DisConnection()
- {
- m_SocketClient.Terminate();
- }
- bool CTCPClient::SetupMCAST()
- {
- const TCHAR szIPv4MCAST[] = TEXT("239.121.1.2");
- const TCHAR szIPv6MCAST[] = TEXT("FF02:0:0:0:0:0:0:1"); // All Nodes local address
- bool result = false;
- if ( m_nSockType == SOCK_UDP )
- {
- if ( m_nMode == AF_IPV4 ) {
- result = m_SocketClient->AddMembership(szIPv4MCAST, NULL);
- } else {
- result = m_SocketClient->AddMembership(szIPv6MCAST, NULL);
- HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
- hr = hr;
- }
- }
- return result;
- }
- void CTCPClient::GetAddress(const SockAddrIn& addrIn, CString& rString) const
- {
- TCHAR szIPAddr[MAX_PATH] = { 0 };
- CSocketHandle::FormatIP(szIPAddr, MAX_PATH, addrIn);
- rString.Format(_T("%s : %d"), szIPAddr, static_cast<int>(static_cast<UINT>(ntohs(addrIn.GetPort()))) );
- }
- ///////////////////////////////////////////////////////////////////////////////
- // 实现ISocketClientHandler的通信方法
- void CTCPClient::OnThreadBegin(CSocketHandle* pSH)
- {
- ASSERT( pSH == m_SocketClient );
- (pSH);
- CString strAddr;
- SockAddrIn sockAddr;
- m_SocketClient->GetSockName(sockAddr);
- GetAddress( sockAddr, strAddr );
- InitializeCriticalSection(&pSH->m_hClient2SrvSection);
- //AppendText( _T("Client Running on: %s\r\n"), strAddr);
- }
- void CTCPClient::OnThreadExit(CSocketHandle* pSH)
- {
- ASSERT( pSH == m_SocketClient );
- DeleteCriticalSection( &pSH->m_hClient2SrvSection );
- (pSH);
- }
- void CTCPClient::OnDataReceived(CSocketHandle* pSH, const BYTE* pbData, DWORD dwCount, const SockAddrIn& addr)
- {
- ASSERT( pSH == m_SocketClient );
- (pSH);
- if( !m_SocketClient->IsOpen() ) return;
- m_TcpParse.ProcessData( pSH, pbData, dwCount );
- }
- void CTCPClient::OnConnectionDropped(CSocketHandle* pSH)
- {
- ASSERT( pSH == m_SocketClient );
- (pSH);
- TRACE(_T("======连接服务器断开.\r\n"));
-
- m_bSocket = FALSE;
- //AppendText( _T("Connection lost with server. Need restart.\r\n") );
- }
- void CTCPClient::OnConnectionError(CSocketHandle* pSH, DWORD dwError)
- {
- ASSERT( pSH == m_SocketClient );
- (pSH);
- _com_error err(dwError);
- m_bSocket = FALSE;
- //AppendText( _T("Communication Error:\r\n%s\r\n"), err.ErrorMessage() );
- }
- BOOL CTCPClient::SendNoticeToServer( int iCmd,int iOperateType,CString sUserName,CString sUID,int iVarID )
- {
- if( m_bSocket )
- return m_TcpParse.SendNoticeToServer( m_SocketClient,iCmd,iOperateType,sUserName,sUID,iVarID );
- else
- return FALSE;
- }
- BOOL CTCPClient::GetServerVer()
- {
- if( m_bSocket )
- return m_TcpParse.GetServerVer( m_SocketClient );
- else
- return FALSE;
- }
- BOOL CTCPClient::TestAlarm()
- {
- if( m_bSocket )
- return m_TcpParse.TestAlarm( m_SocketClient );
- else
- return FALSE;
- }
- BOOL CTCPClient::ConfigAlarm( CString sUID,int iVarID,int iStatus,int iAlarmIndex )
- {
- if( m_bSocket )
- return m_TcpParse.ConfigAlarm( m_SocketClient,sUID,iVarID,iStatus,iAlarmIndex );
- else
- return FALSE;
- }
|