Как отправлять ответы ARP с помощью pcap_sendpacket

#c #networking #pcap #libpcap #arp

#c #сеть #pcap #libpcap #arp

Вопрос:

Я пытаюсь использовать pcap библиотеку для перехвата пакетов. До сих пор мне удавалось перехватывать IP-и ARP-пакеты из трафика моей локальной сети. Теперь я хочу отправить запрос ARP на сервер шлюза по умолчанию. Я не уверен, но я думаю, что мне придется использовать pcap_sendpacket функцию. Я не понимаю, как создать запрос arp, потому что, когда я проверил arphdr структуру, определенную в net/if_arp.h , это что-то вроде этого:

 struct arphdr
  {
    unsigned short int ar_hrd;      /* Format of hardware address.  */
    unsigned short int ar_pro;      /* Format of protocol address.  */
    unsigned char ar_hln;       /* Length of hardware address.  */
    unsigned char ar_pln;       /* Length of protocol address.  */
    unsigned short int ar_op;       /* ARP opcode (command).  */
#if 0
    /* Ethernet looks like this : This bit is variable sized
       however...  */
    unsigned char __ar_sha[ETH_ALEN];   /* Sender hardware address.  */
    unsigned char __ar_sip[4];      /* Sender IP address.  */
    unsigned char __ar_tha[ETH_ALEN];   /* Target hardware address.  */
    unsigned char __ar_tip[4];      /* Target IP address.  */
#endif
  };
  

Как видно, аппаратный адрес находится в #if 0..#endif блоке, что означает, что он фактически закомментирован. Я не понимаю, почему это делается таким образом. Чтобы отправить запрос ARP, я должен заполнить эти поля. Может кто-нибудь дать какие-либо предложения о том, как отправить один запрос ARP с помощью pcap_sendpacket и заполнить эти поля в arphdr?

Комментарии:

1. Вам действительно нужно понимать ARP, и это объясняется в RFC 826, протоколе разрешения адресов Ethernet , который является определением ARP. Каждое поле объясняется.

2. @RonMaupin Не могли бы вы рассказать мне, как заполнить поля заголовка arp. Предоставленная вами ссылка объясняет протокол ARP в целом… но я не нашел ответа на свой вопрос.

3. По сути, вы вводите необходимую информацию: аппаратные и протокольные адреса и длины, а также код операции для запроса. Точно так же, как это объясняется в RFC. Я не понимаю, в чем проблема.

4. В этом определении заголовка часть аппаратного адреса была закомментирована в самой системной библиотеке. Поле __ar_sha не может быть использовано. Как тогда заполнить аппаратный адрес?