Неполадка Ethernet PF_PACKET на локальном хосте - PullRequest
0 голосов
/ 11 ноября 2011

Я работаю над необработанным программированием Ethernet в c. У меня есть два файла клиента и сервера, которые работают на локальном хосте. Я использую свой собственный номер протокола для связи в сокете ().

На стороне клиента у меня есть следующий код

    s = socket(PF_PACKET, SOCK_RAW, 61187);  
    unsigned char dest_mac[6]= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};  
    struct sockaddr_ll socket_address;

        socket_address.sll_family   = PF_PACKET;
        socket_address.sll_protocol = 61187;
        socket_address.sll_ifindex  = ifindex;
        socket_address.sll_hatype   = ARPHRD_ETHER;
        socket_address.sll_pkttype  = PACKET_BROADCAST;
        socket_address.sll_halen    = ETH_ALEN;
        socket_address.sll_addr[0]  = dest_mac[0];
        socket_address.sll_addr[1]  = dest_mac[1];
        socket_address.sll_addr[2]  = dest_mac[2];
        socket_address.sll_addr[3]  = dest_mac[3];
        socket_address.sll_addr[4]  = dest_mac[4];
        socket_address.sll_addr[5]  = dest_mac[5];
        socket_address.sll_addr[6]  = 0x00;
        socket_address.sll_addr[7]  = 0x00;

и затем я отправляю некоторые данные следующим образом

sent = sendto(s, buffer, ETH_HEADER_LEN, 0, (struct sockaddr*)&socket_address, sizeof(socket_address));

На стороне сервера я создаю сокет, как в клиенте, и выполняю recvfrom следующим образом

length = recvfrom(s, buffer, BUF_SIZE, 0, NULL, NULL);

Но я не получаю никаких пакетов на стороне сервера. Кто-нибудь может дать мне знать, в чем проблема?

1 Ответ

0 голосов
/ 11 ноября 2011

Трудно сказать из вашего неполного примера, но я подозреваю, что вы используете SOCK_RAW, где вы хотите использовать SOCK_DGRAM. В вашем SOCK_RAW заголовок Ethernet считается частью указанного вами buffer, т. Е. Ваши настройки адреса назначения не имеют отношения к содержимому пакета. При SOCK_DGRAM содержимое buffer формирует полезную нагрузку сгенерированного кадра Ethernet, а заголовок приходит из поля вашего адреса.

Подобные вещи довольно легко отлаживать, когда вы запускаете tcpdump -neX (или что-то эквивалентное Wireshark или tshark) во время тестирования - вы точно увидите, какой пакет вы генерируете.

...