【问题标题】:How to Extract the Payload from Ethernet Packet (vector<unsigned char>)?如何从以太网数据包中提取有效负载(vector<unsigned char>)?
【发布时间】:2020-02-22 00:38:42
【问题描述】:

我的任务是制作路由器。以太网数据包数据类型为vector &lt;unsigned char&gt;,以太网报头如下:

现在我没有太多使用向量的经验,但我的问题是如何提取有效负载部分? 例如,如果以太网数据包是 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)) ;

并且还给出了以太网头:

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)) ;

【问题讨论】:

  • 你怎么知道payload有多大?
  • @John 有效载荷大小各不相同。但是由于以太网标头的大小是固定的,我相信我们可以通过从整个数据包的大小中减去以太网标头的大小(14 字节)来找到有效负载的大小。
  • 你想要什么形式的payload?你想把它复制到它自己的向量中吗?你只是想要一个指向它的指针吗?
  • @John 我想把它复制到它自己的向量中

标签: c++ networking network-programming ethernet arp


【解决方案1】:

要将一个向量复制到另一个向量中,可以在这里使用第 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2015-02-06
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多