Как извлечь полезный груз из пакета Ethe rnet (вектор )? - PullRequest
0 голосов
/ 22 февраля 2020

Для моего задания мне было поручено сделать маршрутизатор. Тип пакета ethe rnet vector <unsigned char>, а заголовок ethe rnet выглядит следующим образом: enter image description here

Сейчас у меня нет большого опыта работы с векторами, но мой Вопрос в том, как извлечь часть полезной нагрузки? Например, если пакет ethe rnet является пакетом ARP, я хотел бы иметь возможность использовать следующую структуру для проверки кода операции и, по существу, иметь возможность сделать что-то вроде

arp_hdr *arphdr = (arp_hdr *) packet_arp;
struct arp_hdr
{
  unsigned short  arp_hrd;                 /* format of hardware address   */
  unsigned short  arp_pro;                 /* format of protocol address   */
  unsigned char   arp_hln;                 /* length of hardware address   */
  unsigned char   arp_pln;                 /* length of protocol address   */
  unsigned short  arp_op;                  /* ARP opcode (command)         */
  unsigned char   arp_sha[ETHER_ADDR_LEN]; /* sender hardware address      */
  uint32_t        arp_sip;                 /* sender IP address            */
  unsigned char   arp_tha[ETHER_ADDR_LEN]; /* target hardware address      */
  uint32_t        arp_tip;                 /* target IP address            */
} __attribute__ ((packed)) ;

И ethe rnet заголовок также дается:

struct ethernet_hdr
{
#ifndef ETHER_ADDR_LEN
#define ETHER_ADDR_LEN 6
#endif
  uint8_t  ether_dhost[ETHER_ADDR_LEN]; /* destination ethernet address */
  uint8_t  ether_shost[ETHER_ADDR_LEN]; /* source ethernet address */
  uint16_t ether_type;                  /* packet type ID */
} __attribute__ ((packed)) ;

1 Ответ

1 голос
/ 22 февраля 2020

Чтобы скопировать вектор в другой вектор, вы можете использовать 5-й std::vector конструктор здесь https://en.cppreference.com/w/cpp/container/vector/vector

template< class InputIt > vector( InputIt first, InputIt last, const Allocator& alloc = Allocator() );

Таким образом, чтобы извлечь полезную нагрузку (предполагая, что полезная нагрузка - это все в кадре данных, которого нет в заголовке), вы должны сделать:

...assuming the existence of a std::vector<unsigned char> dataframe;
std::vector<unsigned char> payload(dataframe.begin() + sizeof(ethernet_hdr), dataframe.end());
...