簡體   English   中英

在Linux(C程序)下捕獲數據包時使用相同的IP地址

[英]Same IP Addresses while capturing Packets under Linux (C Program)

我通過在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 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 seq: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 _........ FZ .. 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))
        );

我究竟做錯了什么 ?

您使用相同的buf來保存兩個IP地址:

inet_ntop(AF_INET, &ip->saddr, buf, sizeof(buf)),
inet_ntop(AF_INET, &ip->daddr, buf, sizeof(buf))

因為您使用的是相同的緩沖區,並且對inet_ntop()兩次調用都在對printf()的調用之前完成,所以對inet_ntop()的最后一次調用將覆蓋第一次調用的結果。

如果遵循第一個建議,將無法正常工作。 也許您還需要一個用於以太網的緩沖區?

例如

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM