【发布时间】:2020-02-22 00:38:42
【问题描述】:
我的任务是制作路由器。以太网数据包数据类型为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)) ;
【问题讨论】:
-
你怎么知道payload有多大?
-
@John 有效载荷大小各不相同。但是由于以太网标头的大小是固定的,我相信我们可以通过从整个数据包的大小中减去以太网标头的大小(14 字节)来找到有效负载的大小。
-
你想要什么形式的payload?你想把它复制到它自己的向量中吗?你只是想要一个指向它的指针吗?
-
@John 我想把它复制到它自己的向量中
标签: c++ networking network-programming ethernet arp