Sockets 如何使用pcap解包NTP UDP数据包
我可以使用Sockets 如何使用pcap解包NTP UDP数据包,sockets,udp,pcap,Sockets,Udp,Pcap,我可以使用 void my_callback(u_char *useless, const struct pcap_pkthdr* pkthdr, const u_char* packet) 我的数据包有六个输出: 08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00 45 00 00 4C 7C E7 00 00 40 11 3C 28 5B BD 59 C6 0A 00 02 0F 00 7B 00 7B 00 38 B7 9D 24 02 03 E8 00
void my_callback(u_char *useless, const struct pcap_pkthdr* pkthdr, const u_char* packet)
我的数据包有六个输出:
08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00 45 00 00 4C 7C E7 00 00 40 11 3C 28 5B BD 59 C6 0A 00 02 0F 00 7B 00 7B 00 38 B7 9D 24 02 03 E8 00 00 04 A8 00 00 07 51 83 BC 03 DC DC C5 CC 47 F1 F1 69 C3 DC C5 CF 37 D2 5F A7 F5 DC C5 CF 38 3C 2D C2 CF DC C5 CF 38 3C 32 0B 9A
我知道,这是NTP
数据包
我怎样才能获得额外的数据?剪切以太网帧等
谢谢你的帮助
我使用pCAP C++。如果你读pCAP,你会从网络设备中得到原始包。有几种选择:
- 从以太网设备读取数据包
- 从vlan设备读取数据包
- 数据包是从其他设备读取的
- 标头的大小(在您的情况下,它看起来像普通的以太网标头-14字节
)08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00
- 如何查找封装的数据包类型(在您的案例中,最后一个
表示IP)08 00
45 00 4C 7C E7 00 00 40 11…
)后,您可以确定IP头长度:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
您需要:
- IHL定义IP头的大小。这是IP头的第一个字节的低4位。在您的情况下,它是0x5。这意味着5个字或20个字节
- 协议定义了IP报头中封装的数据。在您的情况下为0x11(IPPROTO_UDP)