Search code examples
c++linuxarpraw-sockets

Why doesn´t my program send ARP requests (c++)?


I am learning low level sockets with c++. I have done a simple program that shall send an ARP request. The socket seems to send the packet but I cannot catch it with Wireshark. I have another small program that also sends ARP packets and those packets are captured by Wireshark (my program below is inspired by that program).

Have I done something wrong?

Removed code

EDIT

Removed code

EDIT 2
It seems that I also need to include ethernet header data in the packet, so I now make a packet containing ethernet header and ARP header data. Now the packet goes away and is captured by Wireshark. But Wireshark says it is gratuitous. As you can see, nor IP or MAC address of sender and receiver seem to have been set properly.

36  13.318179   Cimsys_33:44:55 Broadcast   ARP 42  Gratuitous ARP for <No address> (Request)


EDIT 3

    /*Fill arp header data*/
    p.arp.ea_hdr.ar_hrd = htons(ARPHRD_ETHER); 
    p.arp.ea_hdr.ar_pro = htons(ETH_P_IP); 
    p.arp.ea_hdr.ar_hln = ETH_ALEN;            // Must be pure INTEGER, not called with htons(), as I did
    p.arp.ea_hdr.ar_pln = 4;                   // Must be pure INTEGER, not called with htons(), as I did
    p.arp.ea_hdr.ar_op = htons(ETH_P_ARP);

Solution

  • @user315052 say that you should use memcpy(arp->arp_spa, &s_in_addr, sizeof(arg->arp_spa)); but this code just copy first 4 bytes of s_in_addr to arp->arp_spa that absolutely do nothing! so just try this:

    * (int32_t*) arp->arp_spa = inet_addr("192.168.1.1")
    * (int32_t*) arp->arp_tpa = inet_addr("192.168.1.2")