⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.cpp

📁 监控软件的客户端: 1.采用select模型; 2.采用多线程进行网络的接收和发送; 3.网络断线自动断开;
💻 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 + -