#include "stdafx.h" #include "kernel.h" #include "ThreadPool.hpp" #include #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;im_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(static_cast(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; }