为什么我的snmp包无效

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

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

 #include  #include  #include  #include  #include  #include  #define MESSAGE_MAX_LEN 1500 /* MTU, IEEE Std 802.3TM-2015 */ #define PORT 161 /* RFC 1157 */ int out_buf_0_len = 129; /* 0x7f + 2 */ char out_buf_0[] = { 0x30, /* SNMP Packet start */ 0x7f, /* SNMP Packet length */ 0x02, 0x01, 0x00, /* Version */ 0x04, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, /* Community*/ 0xa2, /* GetResponsePDU */ 0x72, /* GetResponsePDU Length */ 0x02, 0x04, 0x2c, 0x80, 0x7e, 0x2f, /* Request id */ 0x02, 0x01, 0x00, /*Error status */ 0x02, 0x01, 0x00, /*Error index */ 0x30, /* Varbind list start */ 0x64, /* Varbind list length*/ 0x30, /* Varbind value start */ 0x62, /* Varbind value length */ 0x06, 0x08, 0x2b, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00, /* OID */ 0x04, /* Value start, type octet-string*/ 0x56, /* Value length */ 0x61, 0x73, 0x64, 0x20, 0x61, /* Value */ 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73 }; int out_buf_1_len = 130; /* 0x80 + 2 */ char out_buf_1[] = { 0x30, /* SNMP Packet start */ 0x80, /* SNMP Packet length */ 0x02, 0x01, 0x00, /* Version */ 0x04, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, /* Community*/ 0xa2, /* GetResponsePDU */ 0x73, /* GetResponsePDU Length */ 0x02, 0x04, 0x2c, 0x80, 0x7e, 0x2f, /* Request id */ 0x02, 0x01, 0x00, /*Error status */ 0x02, 0x01, 0x00, /*Error index */ 0x30, /* Varbind list start */ 0x65, /* Varbind list length*/ 0x30, /* Varbind value start */ 0x63, /* Varbind value length */ 0x06, 0x08, 0x2b, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00, /* OID */ 0x04, /* Value start, type octet-string*/ 0x57, /* Value length */ 0x61, 0x73, 0x64, 0x20, 0x61, /* Value */ 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64, 0x20, 0x61, 0x73, 0x64 }; int my_socket; struct sockaddr_in remote_addr; int socket_create() { printf("Create socket\n"); struct sockaddr_in socket_addr; if ((my_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("Cannot create socket. Exit.\n"); return -1; } memset((char *)&socket_addr, 0, sizeof(socket_addr)); socket_addr.sin_family = AF_INET; socket_addr.sin_addr.s_addr = htonl(INADDR_ANY); socket_addr.sin_port = htons(PORT); if (bind(my_socket, (struct sockaddr *)&socket_addr, sizeof(socket_addr))  0) if (sendto(my_socket, out_buf_1, out_buf_1_len, 0, (struct sockaddr *)&remote_addr, addr_len) < 0) printf("Cannot send data to destination.\n"); } } /* Disable SNMP on local machine. # systemctl stop snmpd * Execute main(): gcc .c && ./a.out * Run SNMP Request: $ snmpget -v 1 -c public 0.0.0.0:161 1.3.6.1.2.1.1.1.0 */ char in_buf[MESSAGE_MAX_LEN]; int main(int argc, char **argv) { if (socket_create() == -1) exit(2); socket_listen(in_buf); } 

在ASN.1基本编码规则(BER)下,ASN.1编码由单个八位字节标记值,一个或多个长度八位字节以及零个或多个内容八位字节组成。 编码的长度部分采用两种forms之一:单八位字节forms或多八位字节forms。 高位指示长度字段采用哪种forms: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八位字节(表示内容长度)。

我在那里停止分析。