2015-10-27 6 views
1

Как получить все пакеты IPv6 (TCP, UDP, ICMP, ...) I, например, на интерфейсе lo. Я отправляю ICMP-пакеты с командой ping6 ::1, но ни один из них не получен.Получить все пакеты 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-пакеты , используйте пакетный (7) сокет с протоколом ETH_P_IP. Обратите внимание, что пакеты сокетов не собирают 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

Смежные вопросы