Připojen obrázek. Ahoj, mám za úkol vytvořit ARP scanner, který s užitím raw BSD socketů oskenuje síť na zadaném interface a vyplivne informace o tom, kdo tam je. Podařilo se mi úspěšně sestavit a odeslat ARP dotaz, který posílám na broadcast. Pro sledování provozu používám příkaz tcpdump -netti <interface> -v "arp". Nicméně, jak je jasně vidět z obrázku níže, tak můj dotaz se odešle 2x, přestože funkci sendto() volám pouze jednou:
Stejně tak se 2x zašle i odpověď. Nicméně tu už můj program pomocí funkce rectfrom() nezachytí. Moje otázky jsou dvě: proč funkce sendto() odešle paket dvakrát a proč mi recvfrom nepřijímá odpovědi?
K obojímu mám své hypotézy, ale netuším, jestli jsou správné, ani co s nimi dělat. Při tvorbě paketu vyplňuji ethernetovou hlavičku, pak ARPovou hlavičku a pak zbytek zprávy dorovnám nulami, aby celý paket měl velikost 60 B. Když jsem ještě měl hlavičku sestavenou špatně a neprováděl padding a tcpdump mi akorát vypsal hexdump zprávy, protože ji neuměl dekódovat, tak bylo vidět, že první odeslaná zpráva měla míň, jak 60B a druhá už byla dorovnaná na 60B.
Ohledně přijímání mě napadá, zda mě náhodou nepředběhne operační systém a nezpracuje si zprávu sám.
Ještě připojím pár technických údajů:
Pro odesílání používám strukturu sockaddr_ll, ve které vyplňuji následující pole:
memset(&sa, 0, sizeof(sockaddr_ll));
sa.sll_family = AF_PACKET;
sa.sll_ifindex = idx.ifr_ifindex; // Index interface vyčtený přes ioctl
sa.sll_halen = ETH_ALEN;
memcpy(sa.sll_addr, ADDR_MAC_BROADCAST, LEN_ADDR_MAC);
sa.sll_protocol = htons(ETH_P_IP); // Zkoušel jsem i ETH_P_ARP, žádný rozdíl
sa.sll_hatype = ARPHRD_ETHER;
sa.sll_pkttype = PACKET_OTHERHOST;
Socket tvořím příkazem socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)
Referenční stroj je centos: Linux 3.10.0-327.36.1.el7.x86_64, který mám virtualizovaný pomocí VirtualBox. ARP skener zkouším na interface enp0s8, který je namapovaný na síť mezi hostem a virtuálkou.
Předem díky za všechnu pomoc