2015-10-27 65 views
1

如何在lo接口上接收所有IPv6數據包(TCP,UDP,ICMP,...)I。我使用命令ping6 ::1發送ICMP數據包,但沒有收到它們。接收所有IPv6數據包

謝謝

#include <linux/if_ether.h> 
#include <error.h> 
#include <stdlib.h> 
#include <sys/types.h> 


#include <unistd.h> 
#include <netinet/in.h> 
#include <netinet/ip6.h> 
#include <string.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 

int main() { 
    int socket_fd; 
    char buffer[1480]; 
    struct sockaddr_in6 sin6; 
    struct sockaddr sin; 

    socket_fd = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW); 
    setsockopt(socket_fd , SOL_SOCKET , SO_BINDTODEVICE , "lo" , strlen("lo")+ 1); 
    if (socket_fd < 0) { 
     perror("Failed to create socket"); 
    } 

    ssize_t data_size; 

    // Why am I unable to receve any data? 
    data_size = recvfrom(socket_fd, buffer, 1480, 0, &sin, (socklen_t *) &sin); 
    return 0; 
} 

回答

1

RFC3542說以下內容:

我們注意到,IPPROTO_RAW 沒有特殊含義到IPv6原始套接字(和IANA 目前保留的255值當用作下一個標題字段 時)。

所以IPPROTO_RAW不保留用於發送/接收IPv6數據包。

使用IPv4,您只能使用IPPROTO_RAW發送,不接收。請參閱man raw(7)

IPPROTO_RAW套接字僅發送。如果您確實想要收到所有IP數據包,請使用帶有ETH_P_IP協議的數據包(7)套接字。 請注意,與原始套接字不同,數據包套接字不會重新組裝IP分段。

您可以使用以下方法:

socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 

但這可能導致其他問題。

如果您只想監控流量,請檢查pcap-library

0

你不bind()荷蘭國際集團的插座的地址試圖從中讀取數據之前。

使用套接字(2)創建套接字時,它位於名稱空間(地址系列)中,但沒有分配給它的地址。 bind()將由addr指定的地址分配給由文件描述符sockfd引用的套接字。 addrlen指定addr指向的地址結構的大小(以字節爲單位)。傳統上,這個操作被稱爲「給套接字分配一個名字」。

還看到:how to bind raw socket to specific interface

+0

它在界面'lo'上綁定; 'setsockopt(socket_fd,SOL_SOCKET,SO_BINDTODEVICE,「lo」,strlen(「lo」)+ 1);' – camabeh