2012-02-05 118 views
0

我想捕獲傳入以及從Linux上的主機傳出的傳出icmpv6數據包。我寫了下面的程序來做到這一點。在這個程序中,我們可以捕獲傳入的數據包,而不是傳出的數據包。陷印適用於icmpv4數據包(代碼的註釋部分),但對於icmpv6數據包則是一個問題。我對使用包過濾(Berkley包過濾)機制不感興趣,與我在下面使用的方法相比,它有點侵入性。你能否告訴我是否有其他可以用來做這件事的東西?還是Linux提供其他機制來做到這一點?使用RAW套接字在Linux上捕獲傳出icmpv6數據包

int main(int argc,char *argv[]) 
{ 
    char buf[500]; 
    struct icmp6_hdr *icmpv6_hdr; 
    int raw_socket = socket(AF_INET, SOCK_RAW,IPPROTO_ICMPV6); 
    //int raw_socket = socket(AF_INET, SOCK_RAW,IPPROTO_ICMP); 
    if(raw_socket <=0) 
    { 
     perror("Could not create raw socket"); 
     exit(1); 
    } 
    while(1) 
    { 
     if(recvfrom(raw_socket, buf, 500, 0,NULL,NULL)<0) 
     { 
      perror("error in recvfrom"); 
      break; 
     } 
     else 
     { 
      icmpv6_hdr = (struct icmp6_hdr *)buf; 
      switch(icmpv6_hdr->icmp6_type) 
      { 
       case ND_ROUTER_SOLICIT: 
        printf("ND_ROUTER_SOLICIT"); 
        break; 
       case ND_ROUTER_ADVERT: 
        printf("ND_ROUTER_ADVERT"); 
        break; 
       case ND_NEIGHBOR_SOLICIT: 
        printf("ND_NEIGHBOR_SOLICIT"); 
        break; 
       case ND_NEIGHBOR_ADVERT: 
        printf("ND_NEIGHBOR_ADVERT"); 
        break; 
       default: 
        printf("icmpv6_type:%x\n",icmpv6_hdr->icmp6_type); 
      } 
     } 
    } 
    return 0; 
} 

回答

0

有一個庫,旨在捕獲任何通過您的NIC稱爲PCAP的網絡流量。它有一個內部過濾器,您可以配置以匹配icmpv6。這是Wireshark和tcpdump用來嗅探流量的庫。 http://www.tcpdump.org/pcap.html

如果您不希望成爲「侵入性」,請務必禁用混雜模式。

0

嗯,我只知道ICMPv6。 由於ICMPv6包含比ICMPv4更多的消息,因此它們會創建一個篩選器sockopt。你可以閱讀相應的RFC細節:

http://tools.ietf.org/html/rfc2292#section-3.2

這一切都在那裏。基本上,你有一個結構,用一些宏定義一個過濾器掩碼並設置套接字選項。 當然,這隻適用於IPv6。

此外,要創建這樣的插座: 插座(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6)