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

📄 cmdprotocol.cpp

📁 我们的网管程序的后台软件,主要是网络方面的内容.
💻 CPP
字号:
/*************************************************
	Copyright (C), 2000-2002, Huayue Co., Ltd.
	File name:  CmdProtocol.cpp
	Module:	    可替代Snmp模块
 	Author:     王华东   
	Version:    1.0   
	Created on : 2003.03.14
	Description:  
	Global function List:  
	Modify History: 
			Date:        Author:         Modification:
		1.  
*************************************************/

#include "stdafx.h"
#include "..\..\GUI\nms.h"	
#include "CmdProtocol.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

/////////////////////////////////////////////////////////
// 

_TCHAR* g_szCmdType[]=
{
	"CMD_GET_COPYRIGHT" , 
	"CMD_GET_GW_ADDR" , 
	"CMD_GET_GW_IP",
	"CMD_GET_IS_GW" ,
	"CMD_GET_SUBNET_NUM" ,
	"CMD_GET_ORIGIN" ,
	"CMD_GET_MANAGE_IP" ,
	"CMD_GET_TRAP_PORT" ,
	"CMD_GET_START_CONFIG" ,
	"CMD_GET_CONFIG_VER" ,
	"CMD_GET_CONFIG_OK" ,
	"CMD_GET_KERNEL_VERSION" ,

	"CMD_SET_COPYRIGHT"	,
	"CMD_SET_GW_ADDR" ,
	"CMD_SET_GW_IP" ,
	"CMD_SET_IS_GW" ,
	"CMD_SET_SUBNET_NUM" ,
	"CMD_SET_ORIGIN" ,
	"CMD_SET_MANAGE_IP" ,
	"CMD_SET_TRAP_PORT" ,
	"CMD_SET_START_CONFIG" ,
	"CMD_SET_CONFIG_VER" ,
	"CMD_SET_CONFIG_OK" ,
	"CMD_SET_KERNEL_UPGRADE" , 
	0
};

int g_szCmd[]=
{
	CMD_GET_COPYRIGHT , 
	CMD_GET_GW_ADDR , 
	CMD_GET_GW_IP,
	CMD_GET_IS_GW ,
	CMD_GET_SUBNET_NUM ,
	CMD_GET_ORIGIN ,
	CMD_GET_MANAGE_IP ,
	CMD_GET_TRAP_PORT ,
	CMD_GET_START_CONFIG ,
	CMD_GET_CONFIG_VER ,
	CMD_GET_CONFIG_OK ,
	CMD_GET_KERNEL_VERSION ,
	
	CMD_SET_COPYRIGHT	,
	CMD_SET_GW_ADDR ,
	CMD_SET_GW_IP ,
	CMD_SET_IS_GW ,
	CMD_SET_SUBNET_NUM ,
	CMD_SET_ORIGIN ,
	CMD_SET_MANAGE_IP ,
	CMD_SET_TRAP_PORT ,
	CMD_SET_START_CONFIG ,
	CMD_SET_CONFIG_VER ,
	CMD_SET_CONFIG_OK ,
	CMD_SET_KERNEL_UPGRADE ,
	0
};

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CCmdProtocol::CCmdProtocol()
{
}

CCmdProtocol::CCmdProtocol(HWND hWnd)
{
	uIDTimer = TIMER_CMD_PROTOCOL;
	uSequence = 0;

	sockfd = 0;
	hMsgWnd = hWnd;
	m_SendPos = -1;
	for(int i=0 ; i<MAX_CMD_QUEUE_NUMBER; i++)
	{
		memset(&gQueryQueue[i] , 0 , sizeof(QueryNMS));
	}

	/* 共享数据保护 */
	hInUse = CreateEvent(NULL , TRUE , TRUE , NULL);

	Cmd_Protocol_init();
}

CCmdProtocol::~CCmdProtocol()
{
	if(sockfd > 0)
	{
		closesocket(sockfd);
		sockfd = 0;
	}
}


/*-----------------------------------------------------------------*/

int CCmdProtocol::Cmd_Send_Cmd(WPARAM wParam, LPARAM lParam)
{
	PQueryNMS	spQueryNMS=NULL;
	
	if( ( (m_SendPos >= 0) && ( m_SendPos < MAX_CMD_QUEUE_NUMBER) )
		|| (hMsgWnd == 0)
	  )
	{
		return -1;
	}

	for(int i=0; i<MAX_CMD_QUEUE_NUMBER; i++)
	{
		if( (gQueryQueue[i].hWnd != 0) ||  (gQueryQueue[i].cb_func != 0) )
		{
			/* 请求服务队列有新的请求 */
			spQueryNMS = &gQueryQueue[i];
			m_SendPos = i;
			break;
		}
	}

	if( (spQueryNMS == 0) ||
		((spQueryNMS->query.cmd_query.gw_ip == 0) || (spQueryNMS->query.cmd_query.cmd_type <= 0)) 
  	 )
	{
		m_SendPos = -1;
		return -1;
	}
	
	uIDTimer=SetTimer(hMsgWnd , uIDTimer , MAX_CMD_TIMEOUT*1000 , NULL);

	/* 插口有数据报到来 */
	struct		sockaddr_in to;
	
	char		SendBuf[MAX_CMD_VALUE_LEN*2];

	int			tolen=sizeof(struct	sockaddr_in) , cmd_len;

	cmd_len = spQueryNMS->query.cmd_query.cmd_len;

	memset(&to , 0 , sizeof(to));

	to.sin_addr.S_un.S_addr = inet_addr(spQueryNMS->query.cmd_query.gw_ip);
	to.sin_family = AF_INET;
	to.sin_port = htons(spQueryNMS->query.cmd_query.listen_port);

	memset(SendBuf , 0 , sizeof(SendBuf));
	memcpy(SendBuf , (char*)&uSequence , sizeof(UINT));
	memcpy(SendBuf+6 , (char*)&spQueryNMS->query.cmd_query.cmd_type , (int)cmd_len+2*sizeof(int));
	
	// Change byte order big->small (pc->860)
	if(pApp->bByteOrderChange)
	{
		Cmd_BtoS(SendBuf+6);
	}

	// Do Some Encode...

	sendto( 
		 sockfd , 
		 SendBuf , 
		 cmd_len+6+2*sizeof(int) , 
		 0 , 
		 (struct sockaddr*)&to , 
		 tolen
		);

	uSequence++;

	return 0;
}

/*-----------------------------------------------------------------*/

void CCmdProtocol::Cmd_Recv_Answer(WPARAM wParam , LPARAM lParam)
{
	/* 插口有数据报到来 */
	struct		sockaddr_in from;

	unsigned long	nRead = 0;
	int				tmp , iRecv;

	char		SendBuf[MAX_CMD_VALUE_LEN*2];
	PAnswerQuery_S	spAnswer=NULL;

	memset(SendBuf , 0 , sizeof(SendBuf));

	/* 插口有多少 Bytes 可读 */
	if( ioctlsocket (sockfd , FIONREAD , &nRead) == SOCKET_ERROR)
	{
		return ;
	}

	/* 接收 */
	tmp = sizeof(struct sockaddr_in);
	iRecv = recvfrom(sockfd , (char*)SendBuf , nRead , 0 , (SOCKADDR*)&from , &tmp);
	if( (iRecv == 0) || (iRecv == SOCKET_ERROR ) )
	{
		return ;
	}

	/* Send */
	if( (m_SendPos >= 0) && ( m_SendPos < MAX_CMD_QUEUE_NUMBER) )
	{
		spAnswer = (PAnswerQuery_S)(SendBuf+6);

		// Change byte order small->big (860->PC)
		if(pApp->bByteOrderChange)
		{
			Cmd_StoB(SendBuf+6);
		}

		// Do Some decode

		if(gQueryQueue[m_SendPos].cb_func != 0)
		{
			gQueryQueue[m_SendPos].cb_func(spAnswer);
		}
		if(gQueryQueue[m_SendPos].hWnd != NULL)
		{
			::SendMessage(gQueryQueue[m_SendPos].hWnd , WM_QUERYCOMPELETE , 0 , (DWORD)(PAnswerQuery_S)spAnswer);
		}

		memset(&gQueryQueue[m_SendPos] , 0 , sizeof(QueryNMS));

		KillTimer(hMsgWnd , uIDTimer);

		m_SendPos = -1;
		PostMessage(hMsgWnd , WM_QUERYSNMP , 0 , 0 );
	}

	m_SendPos = -1;
}

/*-----------------------------------------------------------------*/

void CCmdProtocol::Cmd_Recv_Trap(WPARAM wParam , LPARAM lParam)
{
	/* 插口有数据报到来 */
	struct		sockaddr_in from;

	unsigned long	nRead = 0;
	int				tmp , iRecv;

	char			chTrapRecvBuf[MAX_TRAP_LEN + 1];

	memset(chTrapRecvBuf , 0 , sizeof(chTrapRecvBuf));

	/* 插口有多少 Bytes 可读 */
	if( ioctlsocket (CTrap::sockfd , FIONREAD , &nRead) == SOCKET_ERROR)
	{
		return ;
	}

	/* 接收 */
	tmp = sizeof(struct sockaddr_in);
	iRecv = recvfrom(CTrap::sockfd , (char*)chTrapRecvBuf , nRead , 0 , (SOCKADDR*)&from , &tmp);
	if( (iRecv == 0) || (iRecv == SOCKET_ERROR ) )
	{
		return ;
	}

	if( TrapPerf_StoB(chTrapRecvBuf) != FALSE)
	{
		pApp->pThreadTrap->m_pTrapWnd->SendTrapToDateBase(&from , (char*)(chTrapRecvBuf));
	}
	else
	{
		;	// error packet , small-endian to big-denian error
	}
}

/*-----------------------------------------------------------------*/

int CCmdProtocol::CmdQueryNMS(PQueryNMS spQueryNMS)
{
	::WaitForSingleObject(hInUse , INFINITE);
	::ResetEvent(hInUse);

	int		ret=0;

	for(int i=0; i<MAX_CMD_QUEUE_NUMBER; i++)
	{
		if( gQueryQueue[i].hWnd == 0 &&  gQueryQueue[i].cb_func == 0)
		{
			gQueryQueue[i] = *spQueryNMS;
			Cmd_Send_Cmd(0 , 0);
			break;
		}
	}
	
	if(i >= MAX_CMD_QUEUE_NUMBER)
		ret = -1;

	::SetEvent(hInUse);

	return ret;
}

/*-----------------------------------------------------------------*/

int CCmdProtocol::Cmd_Protocol_init()
{
	if(sockfd > 0)
	{
		closesocket(sockfd);
		sockfd = 0;
	}

	sockfd = StartSocket(5001 , hMsgWnd , WM_RECVSNMP );
	return	sockfd;
}

/*-----------------------------------------------------------------*/

void CCmdProtocol::ReportError()
{
	AnswerQuery_S sAnSwerQuery;

	memset(&sAnSwerQuery , 0 , sizeof(AnswerQuery_S));

	strcpy(sAnSwerQuery.cmd.cmd_value , "失败,目标不可达");

	sAnSwerQuery.cmd.cmd_type = CMD_ERROR;

	if( (m_SendPos >= 0) && ( m_SendPos < MAX_CMD_QUEUE_NUMBER) )
	{
		if(gQueryQueue[m_SendPos].cb_func != 0)
		{
			gQueryQueue[m_SendPos].cb_func(&sAnSwerQuery);
		}
		if(gQueryQueue[m_SendPos].hWnd != NULL)
		{
			::SendMessage(gQueryQueue[m_SendPos].hWnd , WM_QUERYCOMPELETE , 0 , (DWORD)(PAnswerQuery_S)&sAnSwerQuery);
		}

		memset(&gQueryQueue[m_SendPos] , 0 , sizeof(QueryNMS));

		m_SendPos = -1;

		/*
		 *		请求服务队列中还有需要服务的吗?
		*/
		PostMessage(hMsgWnd , WM_QUERYSNMP , 0 , 0);
	}

	m_SendPos = -1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -