CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

求snmp trap 发送的源码或相关报道

楼主GX_NET(小C)2003-09-03 05:18:05 在 VC/MFC / 网络编程 提问

 
        接收没问题,但是不知道如何发送trap,如果用socket   自己组包是不是不太合理  
  直接用snmp   api   函数如何求得那???   高分求解 问题点数:100、回复次数:15Top

1 楼njtlxm(似是故人来)回复于 2003-09-03 09:02:17 得分 0

你说的好像有道理,但是事实上恰恰相反,用socket组包是最合理的,用snmp   api反而很晕。当然,你首先得仔细看看trap协议格式,尤其是vblist的格式Top

2 楼GX_NET(小C)回复于 2003-09-09 20:25:08 得分 0

谢谢,大家继续说呀Top

3 楼GX_NET(小C)回复于 2003-09-09 23:44:44 得分 0

上面仁兄有源码否??   不深感激Top

4 楼GX_NET(小C)回复于 2003-09-10 01:27:38 得分 0

我看msdn上系统发送trap   是用的SnmpExtensionTrap  
  请问自己可以吗Top

5 楼dinghui96(outstanding)回复于 2003-09-10 09:20:39 得分 0

楼上的人兄能否给个应用snmp   trap建立连接,发送数据的例子。  
  小弟很急呀。Top

6 楼njtlxm(似是故人来)回复于 2003-09-10 09:34:58 得分 100

to   dinghui96(ding)   :你好像连SNMP   TRAP的基本常识都不知道,TRAP是UDP,要建立什么连接啊?  
   
  to     GX_NET(什么都不懂)   :源码如下,请指点:  
   
  函数定义:BOOL   SendSnmpUdp(CString   m_szDstIP,CString   m_szSrcIP,CStringArray&   m_ValueList,int   m_SpecialTrapID)  
   
  调用举例:  
  CStringArray   AgentStart;  
  AgentStart.Add("IStart=start");  
  SendSnmpUdp(m_GServerIpAddr,m_GHostIP,AgentStart,50);  
   
  函数源码:  
  BOOL   SendSnmpUdp(CString   m_szDstIP,CString   m_szSrcIP,CStringArray&   m_ValueList,int   m_SpecialTrapID)  
  {  
  int   SectionNum   =   4;  
  int   nStatus;  
  int   SectionLength   =   0;  
  int   VbLength   =   0;  
  int   offset   =   0;  
  unsigned   char   SNMPTrapHeader[6]   =   {   0x30,0x3a   };  
  unsigned   char   SNMPTrapVersion[3]   =   {0x02,0x01,0x00};  
  unsigned   char   SNMPTrapCommunity[8]   =   {0x04,0x06,0x70,0x75,0x62,0x6c,0x69,0x63   };  
  unsigned   char   SNMPType[6]   =   {   0xa4,0x2d   }   ;  
  unsigned   char   SNMPEnterprises[10]   =   {0x06,0x08,0x2b,0x06,0x01,0x04,0x01,0x81,0x9c,0x21   };  
  unsigned   char   SNMPAgentAddress[6]   =   {0x40,0x04,0x0a,0x02,0x01,0x67   };  
  unsigned   char   SNMPGenericID[3]   =   {0x02,0x01,0x06   };  
  unsigned   char   SNMPSpecificID[3]   ={0x02,0x01,0x00   };  
  unsigned   char   SNMPTimeTicks[3]   =   {0x43,0x01,0x00};  
  unsigned   char   SNMPVBList[2]   ={0x30,0x00   };  
  unsigned   char   SNMPVBListName[13]   =   {0x30,0x00,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x81,0x9c,0x21,0x01   };  
  unsigned   char   SNMPVBListValue[255]   ;  
  unsigned   char   SNMPTrapPDU[1200]   ;  
  unsigned   char   SNMPTrapPDUTmp[1200]   ;  
  SNMPSpecificID[2]=m_SpecialTrapID;  
  // BuildVbListBuf(m_ValueList,SNMPVBListName,12);  
  // m_szDstIP   =   "192.168.0.104";  
  if(CheckInWarnInfoList(m_ValueList,m_SpecialTrapID)!=1)  
  return   TRUE;  
  int   VbListLength   =   0;  
  BuildVbListBuf(m_ValueList,SNMPVBListName,13,VbListLength);  
  memcpy(SNMPTrapPDUTmp,BuildVbListBuf(m_ValueList,SNMPVBListName,13,VbListLength),VbListLength);  
  //初始化socket  
  WORD   wVersionRequested;  
  WSADATA   wsaData;  
  int   err;  
  wVersionRequested   =   MAKEWORD(   2,   0   );  
  err   =   WSAStartup(   wVersionRequested,   &wsaData   );  
  if   (   err   !=   0   )   {  
  return   FALSE;  
  }  
  //拼装TRAPPDU  
  struct   hostent   *thisHost;    
  struct   in_addr   in;    
  char   MyName[80];    
  char   *ptr;    
  if(gethostname   (MyName,80)==SOCKET_ERROR)   {  
  WSACleanup();  
  return   FALSE;    
  }  
  if(!(thisHost   =   gethostbyname(MyName)))   {  
  WSACleanup();  
  return   FALSE;    
  }  
  memset((void   *)&in,sizeof(in),0);    
  in.s_addr=*((unsigned   long   *)thisHost->h_addr_list[0]);    
  if(!(ptr   =   inet_ntoa(in)))   {  
  WSACleanup();  
  return   FALSE;    
  }  
  CString   szTmp,szIP;  
  if(m_szSrcIP.IsEmpty()){  
  szIP.Format("%s",ptr);  
  }else{  
  szIP   =   m_szSrcIP;  
  }  
  szTmp=szIP.Left(szIP.Find("."));  
  szIP=   szIP.Mid(szIP.Find(".")+1);  
  SNMPAgentAddress[2]   =   (unsigned   char)   atoi(szTmp);  
  szTmp=szIP.Left(szIP.Find("."));  
  szIP=   szIP.Mid(szIP.Find(".")+1);  
  SNMPAgentAddress[3]   =   (unsigned   char)   atoi(szTmp);  
  szTmp=szIP.Left(szIP.Find("."));  
  szIP=   szIP.Mid(szIP.Find(".")+1);  
  SNMPAgentAddress[4]   =   (unsigned   char)   atoi(szTmp);  
  SNMPAgentAddress[5]   =   (unsigned   char)   atoi(szIP);  
  VbLength   =   0;  
  VbLength   =   VbListLength;  
  int   TrapHeadLen,CommandTrapLen;  
  if(VbLength+25<127){  
  SNMPType[1]   =   VbLength+25;  
  CommandTrapLen   =   2;  
  }else   if(VbLength+25<256){  
  SNMPType[1]   =   0x81;  
  SNMPType[2]   =   VbLength+25;  
  SNMPType[3]   =   '\0';  
  CommandTrapLen   =   3;  
  }else{//   if(VbLength+24<512){  
  SNMPType[1]   =   0x82;  
  SNMPType[2]   =   ((VbLength+25)&0xff00)>>8;  
  SNMPType[3]   =   ((VbLength+25)&0x00ff);  
  SNMPType[4]   =   '\0';  
  CommandTrapLen   =   4;  
  }/*else{  
  SNMPType[1]   =   0x83;  
  SNMPType[2]   =   (offset&0xff0000)>>16;  
  SNMPType[3]   =   (offset&0x00ff00)>>8;  
  SNMPType[4]   =   (offset&0x0000ff);  
  SNMPType[5]   =   '\0';  
  CommandTrapLen   =   5;  
  }*/  
  int   offset1   =   0;  
  offset1   =   13   -   2   +   CommandTrapLen;  
  if(VbLength+   offset1+25<127){  
  SNMPTrapHeader[1]   =   VbLength+   13+25;  
  SNMPTrapHeader[2]   =   '\0';  
  TrapHeadLen   =   2;  
  }else   if(VbLength+   offset1+25<256){  
  SNMPTrapHeader[1]   =   0x81;  
  SNMPTrapHeader[2]   =   VbLength+offset1+25;  
  SNMPTrapHeader[3]   =   '\0';  
  TrapHeadLen   =   3;  
  }else{//   if(VbLength+offset1+24<512){  
  SNMPTrapHeader[1]   =   0x82;  
  SNMPTrapHeader[2]   =   ((VbLength+offset1+25)&0xff00)>>8;  
  SNMPTrapHeader[3]   =   ((VbLength+offset1+25)&0x00ff);  
  SNMPTrapHeader[4]   =   '\0';  
  TrapHeadLen   =   4;  
  }/*else{  
  SNMPTrapHeader[1]   =   0x83;  
  SNMPTrapHeader[2]   =   ((VbLength+offset1+24)&0xff0000)>>16;  
  SNMPTrapHeader[3]   =   ((VbLength+offset1+24)&0x00ff00)>>8;  
  SNMPTrapHeader[4]   =   ((VbLength+offset1+24)&0x0000ff);  
  SNMPTrapHeader[5]   =   '\0';  
  TrapHeadLen   =   5;  
  }*/  
  offset   =   0;  
  memcpy(SNMPTrapPDU,SNMPTrapHeader,TrapHeadLen);  
  offset   +=   TrapHeadLen;  
  memcpy(SNMPTrapPDU+offset,SNMPTrapVersion,3);  
  offset   +=   3;  
  memcpy(SNMPTrapPDU+offset,SNMPTrapCommunity,8);  
  offset   +=   8;  
  memcpy(SNMPTrapPDU+offset,SNMPType,CommandTrapLen);  
  offset   +=   CommandTrapLen;  
  memcpy(SNMPTrapPDU+offset,SNMPEnterprises,10);  
  offset   +=   10;  
  memcpy(SNMPTrapPDU+offset,SNMPAgentAddress,6);  
  offset   +=   6;  
  memcpy(SNMPTrapPDU+offset,SNMPGenericID,3);  
  offset   +=   3;  
  memcpy(SNMPTrapPDU+offset,SNMPSpecificID,3);  
  offset   +=   3;  
  memcpy(SNMPTrapPDU+offset,SNMPTimeTicks,3);  
  offset   +=   3;  
  memcpy(SNMPTrapPDU+offset,SNMPTrapPDUTmp,VbLength);  
  offset   +=   VbLength;  
  SNMPTrapPDU[offset+1]='\0';  
  //创建socket  
  SOCKADDR_IN   addr_in;    
  SOCKADDR_IN   addr_out;    
  SOCKET   sock;    
  if   ((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==INVALID_SOCKET){    
  WSACleanup();  
  return   FALSE;    
  }    
  u_short   alport=IPPORT_RESERVED;    
  addr_in.sin_port   =htons(alport);  
  addr_in.sin_family   =   AF_INET;  
  addr_in.sin_addr.s_addr   =   INADDR_ANY;  
  memset(&(addr_in.sin_zero),0,   8);  
  if   (bind(sock,(LPSOCKADDR)&addr_in,   sizeof(addr_in))==SOCKET_ERROR)   {    
  WSACleanup();  
  return   FALSE;  
  }    
  addr_out.sin_family   =   AF_INET;  
  addr_out.sin_port   =htons(162);  
  if(m_szDstIP.IsEmpty()){  
  szIP.Format("%s",ptr);  
  }else{  
  szIP   =   m_szDstIP;  
  }  
  addr_out.sin_addr.s_addr=     inet_addr(szIP);  
  memset(&(addr_out.sin_zero),0,   8);  
  sendto(sock,(char   *)   SNMPTrapPDU,offset,0,(struct   sockaddr*)&addr_out,sizeof(addr_out));  
  closesocket(sock);  
  WSACleanup();  
  }  
   
  Top

7 楼njtlxm(似是故人来)回复于 2003-09-10 09:36:42 得分 0

unsigned   char*   BuildVbListBuf(CStringArray&   m_ValueList,unsigned   char*   SNMPVBListName,int   m_ListNameLength,int&   m_VbLength)  
  {  
  int   SectionLength,VbLength,offset;  
  int   LenByteLen   =   0;  
  unsigned   char   VbList[1000];  
  unsigned   char   m_szTmp[255];  
  unsigned   char   m_SectionTmp[255];  
  memset(VbList,0,sizeof(VbList));  
  SectionLength   =   0;  
  VbLength   =   0;  
  offset   =   0;  
  for(int   i=0;i<m_ValueList.GetSize();i++){  
  memset(m_szTmp,0,sizeof(m_szTmp));  
  memcpy(m_szTmp,m_ValueList.GetAt(i),m_ValueList.GetAt(i).GetLength());  
  SectionLength   =   m_ValueList.GetAt(i).GetLength();  
  if(SectionLength<127){  
  memmove(m_szTmp+2,m_szTmp,SectionLength);  
  m_szTmp[0]   =   0x04;  
  m_szTmp[1]   =   SectionLength;  
  SectionLength   +=   2;  
  }else{  
  memmove(m_szTmp+3,m_szTmp,SectionLength);  
  m_szTmp[0]   =   0x04;  
  m_szTmp[1]   =   0x81;  
  m_szTmp[2]   =   SectionLength;  
  SectionLength   +=   3;  
  }  
  memset(m_SectionTmp,0,sizeof(m_SectionTmp));  
  if(SectionLength   +   m_ListNameLength   <127){  
  m_SectionTmp[0]   =   0x30;  
  m_SectionTmp[1]   =   SectionLength   +   m_ListNameLength   -2;  
  memcpy(m_SectionTmp+2,SNMPVBListName+2,m_ListNameLength-2);  
  memcpy(m_SectionTmp+2+m_ListNameLength-2,m_szTmp,SectionLength);  
  SectionLength   +=   m_ListNameLength+2   -2;  
  }else{  
  memmove(m_szTmp+3,m_szTmp,SectionLength);  
  m_szTmp[0]   =   0x30;  
  m_szTmp[1]   =   0x81;  
  m_szTmp[2]   =   SectionLength+   m_ListNameLength   -2;  
  memcpy(m_SectionTmp+3,SNMPVBListName+2,m_ListNameLength-2);  
  memcpy(m_SectionTmp+3+m_ListNameLength-2,m_szTmp,SectionLength);  
  SectionLength   +=   m_ListNameLength   +   3   -2;  
  }  
  memcpy(VbList+offset,m_SectionTmp,SectionLength);  
  offset   +=   SectionLength;  
  }  
  m_VbLength   =   offset;  
  if(offset<127){  
  memmove(VbList+2,VbList,offset);  
  VbList[0]   =   0x30;  
  VbList[1]   =   offset;  
  m_VbLength   +=   2;  
  }else   if(offset<256){  
  memmove(VbList+3,VbList,offset);  
  VbList[0]   =   0x30;  
  VbList[1]   =   0x81;  
  VbList[2]   =   offset;  
  m_VbLength   +=   3;  
  }else   {  
  memmove(VbList+4,VbList,offset);  
  VbList[0]   =   0x30;  
  VbList[1]   =   0x82;  
  VbList[2]   =   (offset&0xff00)>>8;  
  VbList[3]   =   (offset&0x00ff);  
  m_VbLength   +=   4;  
  }/*else{  
  memcpy(VbList+5,VbList,offset);  
  VbList[0]   =   0x30;  
  VbList[1]   =   0x83;  
  VbList[2]   =   (offset&0xff0000)>>16;  
  VbList[3]   =   (offset&0x00ff00)>>8;  
  VbList[4]   =   (offset&0x0000ff);  
  m_VbLength   +=   5;  
  }*/  
  return   VbList;  
  }  
  Top

8 楼dinghui96(outstanding)回复于 2003-09-10 10:05:41 得分 0

njtlxm(njtlxm)    
  惭愧,惭愧,以前只是做过sock的通信,对snmp从来没研究过,请多指教。Top

9 楼njtlxm(似是故人来)回复于 2003-09-10 11:29:33 得分 0

所有的网络通信,到最后都是变成一个BUFFER,里面放着一堆的数据。  
  只要你了解协议,完全可以自己编码完成任何的网络数据包的封装。Top

10 楼dinghui96(outstanding)回复于 2003-09-10 21:12:18 得分 0

但是我现在已经没有时间去了解协议啦。只好先找个例子修改一下。Top

11 楼GX_NET(小C)回复于 2003-09-11 03:30:00 得分 0

非常感谢njtlxm(njtlxm)  
  我现在计不得密码了,我登陆都是系统自动登陆的,不知道怎么能得到自己的密码  
  一旦找到密码,马上给分   100Top

12 楼GX_NET(小C)回复于 2003-09-11 03:39:57 得分 0

非常感谢,好了!  
  不知这位大哥何处工作?Top

13 楼njtlxm(似是故人来)回复于 2003-09-11 11:52:01 得分 0

在一家事业单位上班,呵呵。  
  有事用CSDN的短消息与我联系Top

14 楼GX_NET(小C)回复于 2004-02-05 13:49:14 得分 0

to   njtlxm   怎么联系你呀  
  这段代码有一些疑惑,有的接收器收不到  
  说   asn   length   too   longTop

15 楼GX_NET(小C)回复于 2004-02-05 13:53:24 得分 0

能把trap   包的格式说明给我一份码  
  我给你发了短信了,不知道看到没有Top

相关问题

  • 发送DELPHI编写的ICQ源码!
  • 关于snmp代理端trap包的发送
  • 交友请进!快乐图形VC源码发送!
  • 求最简单的smtp接收发送信件的源码!
  • 高分求调制解调器发送语音的源码
  • 关于短信发送的软件源码
  • 急求jsp+javamail带附件发送邮件的源码.
  • 求论坛发送短消息的源码!
  • 谁有关于UDP发送接收数据的源码?
  • Email发送老问题,希望高手给源码一览(VB)

关键词

  • 源码
  • snmp
  • 函数
  • 密码
  • 协议
  • snmptrapheader
  • snmptrappdu
  • snmptype
  • vblength
  • offset

得分解答快速导航

  • 帖主:GX_NET
  • njtlxm

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo