如何解码侦听端口162(Snmp Trap)的结果?

我想通过使用我自己的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; } 

当我收到陷阱时,代码工作正常,我收到一个数字。 通常情况下,我应该在ASN1(hex或二进制)中获取陷阱,但我得到这个: Traplistner结果 。 我想知道12175440是什么意思。 谢谢

简短的回答; 它是用八进制写的msg的内存地址。

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

这是由于两个组合的结合:

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

  2. 将数组作为参数传递给函数将转换为传递指向第一个元素的指针。 所以这些陈述是等价的:

     printf("%p\n", msg); printf("%p\n", &msg[0]); 

要实际打印您收到的数据,请添加以下内容:

 for (int i = 0; i < n; ++i) { printf("%02x ", (unsigned char)msg[i]); } printf("\n");