📄 cmdprotocol.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 + -