Я пытаюсь создать простой эхо-сервер / клиент, который работает на уровне Ethernet (используя сырые сокеты).Серверная сторона сама по себе работает и показывает все входящие пакеты на eth0.Клиент работает и отправляет пакеты Ethernet по eth0 (я проверил это с помощью wireshark и могу видеть, что пакеты выходят.) Теперь я хочу создать фильтр, чтобы посмотреть только те пакеты, которые мне интересны.(Это основано на адресах назначения / источника.)
В приведенном ниже коде кто-то может объяснить мне, почему strncmp возвращает ноль (что означает совпадение строк), но все же "if (ethernet_header-> h_dest == mac) "не удалось выполнить (не соответствует).Обе переменные "mac" и "ethernet_header-> h_dest" имеют одинаковый тип и длину.
Еще немного предыстории: - Это сделано на 64-битной Linux (Ubuntu) - я использую eth0 на той же машинедля отправки / получения .... Я не думаю, что это должно быть проблемой?
Я просто не понимаю, почему strcmp возвращает совпадение, а если нет.Чего мне не хватает ??
void ParseEthernetHeader(unsigned char *packet, int len) {
struct ethhdr *ethernet_header;
unsigned char mac[ETH_ALEN] = {0x01, 0x55, 0x56, 0x88, 0x32, 0x7c};
if (len > sizeof(struct ethhdr)) {
ethernet_header = (struct ethhdr *) packet;
int result = strncmp(ethernet_header->h_dest, mac, ETH_ALEN);
printf("Result: %d\n", result);
if(ethernet_header->h_dest == mac) {
/* First set of 6 bytes are Destination MAC */
PrintInHex("Destination MAC: ", ethernet_header->h_dest, 6);
printf("\n");
/* Second set of 6 bytes are Source MAC */
PrintInHex("Source MAC: ", ethernet_header->h_source, 6);
printf("\n");
/* Last 2 bytes in the Ethernet header are the protocol it carries */
PrintInHex("Protocol: ", (void *) ðernet_header->h_proto, 2);
printf("\n\n");
printf("Length: %d\n",len);
}
} else {
printf("Packet size too small (length: %d)!\n",len);
}
}