为什么我的snmp数据包无效

时间:2017-08-24 22:24:22

标签: c networking snmp

我写了一个类似的问题here,但没有得到解决我问题的答案,所以我再次在stackoverflow上写这个问题,并希望有人可以帮助我。

这是一个关于我的问题的可运行示例。数据包out_buf_0表示有效的SNMP数据包,可以通过UDP发送。数据包out_buf_1out_buf_0相同,但最后一个字符0x64更多。此外,由于附加字符,我提高了所有长度+ 1。 为什么out_buf_1不是有效的SNMPv1数据包/为什么它不能通过UDP发送?注意:SNMP请求无法在终端中显示,因为来自客户端的请求ID与out_buf_0和{不同{1}},查看wireshark以查看请求/响应。包括我的SNMPv1数据包out_buf_1在内的整个帧长度为1368位,out_buf_0应为1376位。

out_buf_1

1 个答案:

答案 0 :(得分:2)

在ASN.1基本编码规则(BER)下,ASN.1编码由单个八位位组标记值,一个或多个长度八位位组以及零个或多个内容八位字节组成。编码的长度部分采用两种形式之一:单八位字节形式或多八位字节形式。高位指示长度字段采用哪种形式:unset是单个八位字节长度,其中单个八位字节(范围00..7F)表示内容长度,并且set是多个八位字节长度(80 .. FF),其中第一个八位字节的剩余位指定后续八位字节包含实际内容长度的数量。

int out_buf_1_len = 130; /* 0x80 + 2 */
char out_buf_1[] = {
0x30, /* SNMP Packet start */
0x80, /* SNMP Packet length */
...

这里有一个0x80的长度八位字节,表示它是一个多字节长度字段,长度字段本身的长度为0,因此预期内容的长度为0.你是什么此时需要的是0x81(此处0x80位表示多字节长度,此处0x01部分表示内容长度后跟一个八位字节)后跟0x80个八位字节(表示您的内容长度) )在你的其他内容之前。

我在那里停止分析。