我正在通过在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:64协议:6 src:192.168.10.145 dst 192.168.10.145 TCP src:46888 dst:80 seq:3048209837胜利: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 seq:1969857171胜利: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胜利: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。'.. ... oy ..&..
这是我的代码:
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))
);
我在做什么错了?
答案 0 :(得分:1)
您使用相同的buf
来拥有两个IP地址:
inet_ntop(AF_INET, &ip->saddr, buf, sizeof(buf)),
inet_ntop(AF_INET, &ip->daddr, buf, sizeof(buf))
由于您使用的是 same 缓冲区,并且对inet_ntop()
的两次调用都在对printf()
的调用之前完成,因此对inet_ntop()
的最后一次调用将覆盖第一次调用的结果。
答案 1 :(得分:0)
如果遵循第一个建议,将无法使用。也许您还需要一个用于以太网的缓冲区?
例如
struct ethhdr * eth =(struct 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 ]
?