如何从以太网数据包(vector<unsigned char>)中提取有效载荷?
How to Extract the Payload from Ethernet Packet (vector<unsigned char>)?
在我的任务中,我接到了制作路由器的任务。以太网包数据类型为vector <unsigned char>
,以太网包头如下:
现在我没有太多使用矢量的经验,但我的问题是如何提取有效负载部分?
例如,如果以太网数据包是一个 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)) ;
要将一个向量复制到另一个向量中,您可以在此处使用第 5 个 std::vector
构造函数 https://en.cppreference.com/w/cpp/container/vector/vector
template< class InputIt > vector( InputIt first, InputIt last, const Allocator& alloc = Allocator() );
因此,要提取有效负载(假设有效负载是数据帧中不在 header 中的所有内容),您需要执行以下操作:
...assuming the existence of a std::vector<unsigned char> dataframe;
std::vector<unsigned char> payload(dataframe.begin() + sizeof(ethernet_hdr), dataframe.end());
在我的任务中,我接到了制作路由器的任务。以太网包数据类型为vector <unsigned char>
,以太网包头如下:
现在我没有太多使用矢量的经验,但我的问题是如何提取有效负载部分? 例如,如果以太网数据包是一个 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)) ;
要将一个向量复制到另一个向量中,您可以在此处使用第 5 个 std::vector
构造函数 https://en.cppreference.com/w/cpp/container/vector/vector
template< class InputIt > vector( InputIt first, InputIt last, const Allocator& alloc = Allocator() );
因此,要提取有效负载(假设有效负载是数据帧中不在 header 中的所有内容),您需要执行以下操作:
...assuming the existence of a std::vector<unsigned char> dataframe;
std::vector<unsigned char> payload(dataframe.begin() + sizeof(ethernet_hdr), dataframe.end());