📄 client.cpp
字号:
// Client.cpp: implementation of the CClient class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MonitorClientApp.h"
#include "Client.h"
#include "MonitorClientAppDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////////
extern HWND g_hRecvWnd;
extern CDataLog m_oDataLog;
//////////////////////////////////////////////////////////////////////
HANDLE CClient::m_hEventExitBeepThread = NULL;
HANDLE CClient::m_hThreadBeep = NULL;
char CClient::m_RcvBuffer[MAXBUFLEN];
SOCKET CClient::m_destSocket = INVALID_SOCKET;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
UINT CClient::Recv_Thread(void* cs)
{
SOCKET clientSocket=(SOCKET)cs;
while( 1 )
{
int numrcv = recv( clientSocket, m_RcvBuffer, MAXBUFLEN, NO_FLAGS_SET);
if( (numrcv == 0) || (numrcv == SOCKET_ERROR) )
{
sprintf( m_RcvBuffer, "%s", "Connection terminated!" );
::PostMessage(g_hRecvWnd,WM_RECVDATA,WPARAM(strlen( m_RcvBuffer) ),LPARAM(m_RcvBuffer) );
::PostMessage(g_hRecvWnd,WM_RECVDATA_MODIFY_TRAY,WPARAM(STATUS_EXCEPTION),NULL );
closesocket( CClient::m_destSocket );
CClient::m_destSocket = INVALID_SOCKET;
break;
}
else
{
ST_SEND_RCV_INFO oDataInfo = *(ST_SEND_RCV_INFO*)m_RcvBuffer;
switch( oDataInfo.m_eCommand )
{
case SEND_ALL_CLIENT_ALARMDATA:
ProcessAlarm( oDataInfo );
break;
case SEND_ALL_CLIENT:
m_RcvBuffer[numrcv]='\0';
::PostMessage(g_hRecvWnd,WM_RECVDATA,WPARAM( strlen(oDataInfo.uSendData.data ) ),LPARAM(oDataInfo.uSendData.data) );
::PostMessage(g_hRecvWnd,WM_RECVDATA_MODIFY_TRAY,WPARAM(STATUS_NORMAL),NULL );
break;
case GET_LAST_ALARM_LOG:
{
ST_NET_LOGINFO oLogInfo = m_oDataLog.ReadLastLogFromFile();
if( strcmp( oLogInfo.cTime, oDataInfo.uSendData.m_AlarmInfo.cTime ) < 0 )
{
ProcessAlarm( oDataInfo );
}
}
break;
default:
break;
}
}
}
return 1;
}
UINT CClient::Beeper(LPVOID pParam)
{
while(true)
{
Beep(800,500);
Beep(1000,500);
Beep(800,500);
Beep(1000,500);
if(WaitForSingleObject( m_hEventExitBeepThread,2000) == WAIT_OBJECT_0)
{
ResetEvent( m_hEventExitBeepThread );
//AfxEndThread( 0 );
return FALSE;
}
}
return TRUE;
}
void CClient::ProcessAlarm( ST_SEND_RCV_INFO& oDataInfo )
{
ST_NET_LOGINFO oLogSave = oDataInfo.uSendData.m_AlarmInfo;
//记录一下
m_oDataLog.AddLog( oLogSave );
static CString strDataNormal;
strDataNormal.Format( "%s", "AlarmData!!!" );
if( NULL == m_hThreadBeep )
{
ResetEvent( m_hEventExitBeepThread );
m_hThreadBeep = AfxBeginThread(Beeper,NULL);
}
::PostMessage(g_hRecvWnd,WM_RECVDATA,WPARAM(strDataNormal.GetLength()),LPARAM((LPCTSTR)strDataNormal) );
::PostMessage(g_hRecvWnd,WM_RECVDATA_ALARM,WPARAM(sizeof(ST_SEND_RCV_INFO)),LPARAM(&oDataInfo) );
::PostMessage(g_hRecvWnd,WM_RECVDATA_MODIFY_TRAY,WPARAM(STATUS_ALARM),NULL );
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CClient::CClient()
{
m_hEventExitBeepThread = CreateEvent( NULL, TRUE, FALSE, "ExitRevThread" );
m_strServerIP = "192.168.254.168";
m_nListenPort = 56790;
}
CClient::~CClient()
{
StopBeep();
}
void CClient::StopBeep()
{
if( NULL != m_hEventExitBeepThread )
{
SetEvent( m_hEventExitBeepThread);
if( NULL != m_hThreadBeep )
{
DWORD dwWait = 1;
while( (dwWait = ::WaitForSingleObject( m_hThreadBeep, 10 ) ) == WAIT_TIMEOUT )
{
Sleep( 1000 );
}
m_hThreadBeep = NULL;
}
}
}
BOOL CClient::Init_net()
{
/////////////////////////网络初始化///////////////////////////////////
WSAData Data;
int status=WSAStartup(MAKEWORD(1, 1), &Data);
if (status != 0)
AfxMessageBox("ERROR: WSAStartup unsuccessful!",MB_OK);
return true;
}
void CClient::DisconnectLink()
{
if( INVALID_SOCKET == m_destSocket )
return;
//发送给S
ST_SEND_RCV_INFO oInfo;
oInfo.m_eCommand = CLOSE_SOCKET;
send( m_destSocket,(char*)&oInfo,sizeof( ST_SEND_RCV_INFO ), 0 );
//结束R线程
m_destSocket = INVALID_SOCKET;
}
BOOL CClient::BuildLink()
{
if( INVALID_SOCKET != m_destSocket )
return FALSE;
int status = 0 ;
unsigned long destAddr = inet_addr(m_strServerIP); //暂时定为本机使用
memcpy(&m_destSockAddr.sin_addr, &destAddr,sizeof(destAddr));
m_destSockAddr.sin_port = htons( m_nListenPort );
m_destSockAddr.sin_family=AF_INET;
m_destSocket = socket(AF_INET, SOCK_STREAM, 0);
if (m_destSocket == INVALID_SOCKET)
{
AfxMessageBox("ERROR: socket unsuccessful!",MB_OK);
int status=WSACleanup();
if (status == SOCKET_ERROR)
AfxMessageBox("ERROR: WSACleanup unsuccessful!",MB_OK);
return FALSE ;
}
///////////////////////////连接网络////////////////////////////////////////////
status = connect(m_destSocket, (LPSOCKADDR) &m_destSockAddr,sizeof(m_destSockAddr));
if (status == SOCKET_ERROR)
{
AfxMessageBox("ERROR: connect unsuccessful!",MB_OK);
status = closesocket( m_destSocket);
if (status == SOCKET_ERROR)
AfxMessageBox("ERROR: closesocket unsuccessful!",MB_OK);
status=WSACleanup();
if (status == SOCKET_ERROR)
AfxMessageBox("ERROR: WSACleanup unsuccessful!",MB_OK);
m_destSocket = INVALID_SOCKET;
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////
/* if(clientsocket.Create()==0)
{
MessageBox("ERROR: Create unsuccessful!",MB_OK);
return false;
}
if(clientsocket.Connect(DEST_IP_ADDR,56790)==0)
{
MessageBox("ERROR: Connect unsuccessful!",MB_OK);
return false;
}
int p=clientsocket.GetLastError();*/
CString strName = GetCurComputerName();
SendDataToServer( BUILD_LINK_TO_SERVER, (LPCTSTR)strName, strName.GetLength() );
AfxBeginThread(Recv_Thread,(LPVOID)m_destSocket);
return TRUE;
}
CString CClient::GetCurComputerName()
{
char szhostname[128];
gethostname(szhostname,128);
CString strName( szhostname );
return strName + ":";
}
int CClient::SendDataToServer( E_COMMAND eCommand, const char *pData, int nDataCount )
{
if( INVALID_SOCKET == m_destSocket )
return 0;
ST_SEND_RCV_INFO oInfo;
oInfo.m_eCommand = eCommand;
switch( eCommand )
{
case BUILD_LINK_TO_SERVER:
case GET_LAST_ALARM_LOG:
case SEND_ALL_CLIENT:
strcpy( oInfo.uSendData.data, pData );
break;
case CLOSE_SOCKET:
break;
default:
Beep( 800, 180 );
Beep( 800, 180 );
break;
}
return send( m_destSocket,(char*)&oInfo,sizeof( ST_SEND_RCV_INFO ), 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -