在Linux下捕获数据包时使用相同的IP地址(C程序)
我通过用c编写代码来接收网络数据包。到目前为止,我正确地接收数据包,但我面临的唯一问题是,我的以太网、TCP和UDP的IP地址相同。通过tcpdump接收数据时,我没有遇到任何问题 我的系统的以太网源是:在Linux下捕获数据包时使用相同的IP地址(C程序),c,packet-sniffers,C,Packet Sniffers,我通过用c编写代码来接收网络数据包。到目前为止,我正确地接收数据包,但我面临的唯一问题是,我的以太网、TCP和UDP的IP地址相同。通过tcpdump接收数据时,我没有遇到任何问题 我的系统的以太网源是:b0:10:41:fc:d7:2f 我的接口的IP地址是:192.168.10.145 这些是接收到的数据包: 162>>>接收到66字节的数据包:以太网src: b0:10:41:fc:d7:2f dst:b0:10:41:fc:d7:2f类型:0x800 IP版本:4 ihl:5 ttl:6
b0:10:41:fc:d7:2f
我的接口的IP地址是:
192.168.10.145
这些是接收到的数据包:
162>>>接收到66字节的数据包:以太网src:
b0:10:41:fc:d7:2f dst:b0:10:41:fc:d7:2f类型:0x800 IP版本:4
ihl:5 ttl:64协议:6 src:192.168.10.145 dst 192.168.10.145 TCP
src:46888 dst:80序列:3048209837 win:4508 ACK 000000:b728 0050
b5af fdad 0e1d 21a1 8010 119c.(.P.…..0x0010:e258 0000)
0101 080a 5a05 1f81 0595 4669
163>>>接收到66字节的数据包:以太网src:
b0:10:41:fc:d7:2f dst:b0:10:41:fc:d7:2f类型:0x800 IP版本:4
ihl:5 ttl:64协议:6 src:192.168.10.145 dst 192.168.10.145 TCP
src:38836 dst:443序列:1969857171 win:341 ACK 000000:97b4 01bb
7569 a293 0473 15bc 8010 0155…ui…s…U 0x0010:11f1 0000
0101 080a 4011 29b5 45f5 c4da
164>>>接收到1024字节的数据包:以太网src:
0:1a:a0:3f:d6:fc dst:0:1a:a0:3f:d6:fc类型:0x800 IP版本:4 ihl:
5 ttl:64协议:6 src:110.93.233.24 dst 110.93.233.24 TCP src:
80 dst:46888 seq:236790177 win:595 ACK 000000:0050 b728 0e1d
21a1 b5af fdad 8010 0253.P.(..!..S 0x0010:6e5f 0000 0101
080a 0595 46a1 5a05 199a n_…….F.Z.0x0020:f107 eb73 1b82
1492 c88f e84c 101a 9416…s…L…0x0030:9a27 900f 2020
1985 836f 79d5 8a26 15fa
这是我的代码:
layer2: {
struct ethhdr *eth = (struct ethhdr*) data;
printf("\tEthernet src: %s dst: %s type: %#04x\n",
ether_ntoa((const struct ether_addr*) eth->h_source),
ether_ntoa((const struct ether_addr*) eth->h_dest),
ntohs(eth->h_proto)
);
protocol = ntohs(eth->h_proto);
next_hdr = (char *) (eth + 1);}
layer3: switch (protocol) {
case ETH_P_IP: {
/* Parse IP protocol */
struct iphdr *ip = (struct iphdr*) next_hdr;
char buf[32];
printf("\tIP version: %u ihl: %u ttl: %u protocol: %u src: %s dst %s\n",
ip->version,
ip->ihl,
ip->ttl,
ip->protocol,
inet_ntop(AF_INET, &ip->saddr, buf, sizeof(buf)),
inet_ntop(AF_INET, &ip->daddr, buf, sizeof(buf))
);
我做错了什么?您使用相同的
buf
来保存两个IP地址:
inet_ntop(AF_INET, &ip->saddr, buf, sizeof(buf)),
inet_ntop(AF_INET, &ip->daddr, buf, sizeof(buf))
因为您使用的是同一个缓冲区,而且对
inet\u ntop()
的两个调用都是在调用printf()
之前完成的,所以对inet\u ntop()
的最后一个调用将覆盖第一个调用的结果。如果遵循第一个建议,将无法工作。也许您也需要一个以太网缓冲区
例如
结构ethhdr*eth=(结构ethhdr*)缓冲区
并使用
eth->h_dest[0],eth->h_dest[1],eth->h_dest[2],eth->h_dest[3],eth->h_dest[4],>eth->h_dest[5]
?谢谢。它修复了IP地址,但以太网地址呢?我尝试了使用不同的指针,但没有任何效果。
ether\u ntoa
可能使用静态内部缓冲区,这意味着两个函数调用都指向同一个位置,因此只会反映最后一个调用。您需要在两个单独的行中进行两个调用并复制结果。