接收所有IPv6数据包

时间:2015-10-27 17:57:16

标签: c linux sockets ipv6

如何在lo接口上接收所有IPv6数据包(TCP,UDP,ICMP,...)I。我发送的命令为ping6 ::1的ICMP数据包,但都没有收到。

谢谢

#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;
}

2 个答案:

答案 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

答案 1 :(得分:0)

在您尝试从其中读取数据之前,您没有bind()将套接字how to bind raw socket to specific interface发送到地址。

  

使用socket(2)创建套接字时,它存在于名称空间(地址系列)中,但没有为其分配地址。 bind()将addr指定的地址分配给文件描述符sockfd引用的套接字。 addrlen指定addr指向的地址结构的大小(以字节为单位)。传统上,此操作被称为&#34;为套接字分配名称&#34;。

另见:Flatline graph example

相关问题