C 如何解码监听端口162(Snmp陷阱)的结果?

C 如何解码监听端口162(Snmp陷阱)的结果?,c,snmp,snmptrapd,C,Snmp,Snmptrapd,我想使用自己的traplistener获取snmp陷阱。事实上,我使用了一个在互联网上找到的代码,我添加了一些修改,现在它可以工作了。我可以通过162端口收听 #include "stdio.h" #include "winsock2.h" #pragma comment(lib, "ws2_32.lib") #define SNMP_TRAP_PORT 162 #define MAX_MSG 400 static void init(void) { WSADATA wsa; i

我想使用自己的traplistener获取snmp陷阱。事实上,我使用了一个在互联网上找到的代码,我添加了一些修改,现在它可以工作了。我可以通过162端口收听

#include "stdio.h"
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#define SNMP_TRAP_PORT 162
#define MAX_MSG 400

static void init(void)
{

  WSADATA wsa;
    int err = WSAStartup(MAKEWORD(2, 2), &wsa);
    if(err < 0)
    {
        puts("WSAStartup failed !");
        exit(EXIT_FAILURE);
    }

}

static void end(void)
{

    WSACleanup();

}

int main(int argc, char *argv[]) {


  int sd, rc, n, cliLen;
  struct sockaddr_in cliAddr, servAddr;
  char msg[MAX_MSG];



  /* socket creation */
  init(); 
  sd= socket(AF_INET, SOCK_DGRAM, 0);
  if(sd<0) {
    printf("can't open socket \n");
    exit(1);
  }

  /* bind local server port */
  servAddr.sin_family = AF_INET;
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servAddr.sin_port = htons(SNMP_TRAP_PORT);
  rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr));
  if(rc<0) {
    printf("can't bind port number %d \n", SNMP_TRAP_PORT);
    exit(1);
  }

  printf("waiting for SNMP Traps on UDP port %d\n", SNMP_TRAP_PORT);

  /* server infinite loop */
  while(1) {

    /* init buffer */
    memset(msg,0x0,MAX_MSG);


    /* receive message */
    cliLen = sizeof(cliAddr);
    n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *) &cliAddr, &cliLen);

    if(n<0) {
      printf("%s: cannot receive data \n",argv[0]);
      continue;
    }
    /*message is encoded with ASN1 and should be decoded*/  
    /* print received message */
    printf("SNMP Trap received from %s : %o\n", inet_ntoa(cliAddr.sin_addr),msg);


  }/* end of server infinite loop */
end();
return 0;

}
#包括“stdio.h”
#包括“winsock2.h”
#pragma注释(lib,“ws2_32.lib”)
#定义SNMP_陷阱_端口162
#定义MAX_MSG 400
静态void init(void)
{
WSADATA wsa;
int err=WSAStartup(MAKEWORD(2,2),&wsa);
如果(误差<0)
{
puts(“WSAStartup失败!”);
退出(退出失败);
}
}
静态空心端(空心端)
{
WSACleanup();
}
int main(int argc,char*argv[]){
内部sd、rc、n、cliLen;
cliAddr、servAddr中的结构sockaddr\u;
char msg[MAX_msg];
/*套接字创建*/
init();
sd=插座(AF INET,SOCK DGRAM,0);

if(sd简短回答;它是以八进制写入的
msg
的内存地址

如果您在具有32位
int
和64位指针的小型endian机器上运行此代码,则很可能是
msg
地址的32位低位

这是由于两种原因的结合:

  • printf
    格式说明符
    %o
    将参数数据中的下一个字节解释为整数,并以八进制打印

  • 将数组作为参数传递给函数转换为将指针传递给第一个元素。因此这些语句是等效的:

    printf("%p\n", msg);
    printf("%p\n", &msg[0]);
    
  • 要实际打印收到的数据,请添加以下内容:

    for (int i = 0; i < n; ++i) {
        printf("%02x ", (unsigned char)msg[i]);
    }
    printf("\n");
    
    for(int i=0;i
    您好,我想谢谢您。它正在工作。现在我得到的是一组数字。我想我收到了ASN.1消息。我想我必须用脚本解码消息。