[英]How to retrieve TCP packet informations given by libpcap functions on MacOS?
我正在尝试使用 libpcap 函数在 MacO 上进行数据包嗅探。 我正在使用在互联网上找到的显示如何使用 libpcap 的代码,问题是这是 linux 的代码,而我在 macos 上。 所以我在将不同的 struct iphdr/struct tcphdr 等从 Linux 翻译到 MacOs 时遇到了很多问题。 我成功了 struct iphdr 和 struct ethhdr,但我无法翻译 struct tcphdr。
这是 Linux 上的 struct tcphdr:
struct tcphdr {
25 __be16 source;
26 __be16 dest;
27 __be32 seq;
28 __be32 ack_seq;
29 #if defined(__LITTLE_ENDIAN_BITFIELD)
30 __u16 res1:4,
31 doff:4,
32 fin:1,
33 syn:1,
34 rst:1,
35 psh:1,
36 ack:1,
37 urg:1,
38 ece:1,
39 cwr:1;
40 #elif defined(__BIG_ENDIAN_BITFIELD)
41 __u16 doff:4,
42 res1:4,
43 cwr:1,
44 ece:1,
45 urg:1,
46 ack:1,
47 psh:1,
48 rst:1,
49 syn:1,
50 fin:1;
51 #else
52 #error "Adjust your <asm/byteorder.h> defines"
53 #endif
54 __be16 window;
55 __sum16 check;
56 __be16 urg_ptr;
57 };
这是一个用于 MacOS 的:
struct tcphdr {
unsigned short th_sport; /* source port */
unsigned short th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
#if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN
unsigned int th_x2:4, /* (unused) */
th_off:4; /* data offset */
#endif
#if __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN
unsigned int th_off:4, /* data offset */
th_x2:4; /* (unused) */
#endif
unsigned char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
unsigned short th_win; /* window */
unsigned short th_sum; /* checksum */
unsigned short th_urp; /* urgent pointer */
};
问题是我不知道在哪里可以找到 MacOs 结构中 Linux 结构中存在的 ack/doff/urg 等字段? 有人可以告诉我从哪里获得这些信息吗? 我在 C 语言中的理解程度并不高,无法理解不同的定义。
TCP 报头的结构由RFC 793及以后的规范定义; 它们不是由 Linux 或 Windows 或 BSD/macOS 或...定义的。
Tcpdump 过去依赖于操作系统的结构,但是当不同的操作系统和不同的操作系统版本具有不同的标头时,这会导致问题,因此它现在在其自己的源代码中有一个 BSD 标头的副本。
如果您正在使用最初为 Linux 编写的代码,您可能只想将 Linux 标头复制到您自己的程序中,然后只需替换
#if defined(__LITTLE_ENDIAN_BITFIELD)
和
#if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN
并更换
#elif defined(__BIG_ENDIAN_BITFIELD)
和
#elif __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN
Linux 代码包含在 GNU 公共许可证 (GPL) 版本 2 中,因此如果您包含它,您的代码也必须包含在该许可证中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.