2015-10-27 48 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