gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:29:12 25 4
gpt4 key购买 nike

我想使用我自己的陷阱监听器来获取 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(十六进制或二进制)中获取陷阱,但我只得到这个:Traplistner result .我想知道 12175440 是什么意思。谢谢

最佳答案

简答;是msg的内存地址,用八进制写成。

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

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

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

  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");

关于c - 如何解码监听162端口的结果(Snmp Trap)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38484287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com