gpt4 book ai didi

c - 解码以太网帧和数据对齐

转载 作者:行者123 更新时间:2023-11-30 15:53:53 25 4
gpt4 key购买 nike

所以我正在尝试解码以太网帧 eth 和 ip header 。我有一个程序框架,它从文件中读取输入数据,并为我提供一个包含帧数据的结构。

我已经用谷歌搜索并阅读了有关该主题的其他帖子,但一无所获。例如: Data Alignment with network programming http://en.wikipedia.org/wiki/Data_structure_alignment

我不确定问题是什么。显然我对 C 很陌生。

如果我只是尝试使用 memcpy 并将数据复制到我的 eth 和 ip header 结构中,则大多数数据都会很好,但不是我的 ip 结构中的 ip 地址。我还尝试从输入结构中读取 1 字节、2 字节和 4 字节 block ,但它没有给我正确的数据。

以下是输入文件中的输入数据帧的示例:

200 0000 0002 0200 0000 0012 0800 4500 0026 17d4 81e7 ff01 0000 0a02 0002 0c0c 0c0c 0000 e802 c04b 0004 3e89 3325 0006 ddef 0809

这是我使用的 header 结构

struct ethhdr{
char da[6];
char sa[6];
uint16_t pt;
};
typedef struct ethhdr ethhdr;

struct iphdr{
#ifdef WORDS_BIGENDIAN
unsigned int ip_v:4; /* version */
unsigned int ip_hl:4; /* header length */
#else
unsigned int ip_hl:4; /* header length */
unsigned int ip_v:4; /* version */
#endif
uint8_t ip_tos; /* type of service */
uint16_t ip_len; /* total length */
uint16_t ip_id; /* identification */
uint16_t ip_off; /* fragment offset field */
uint8_t ip_ttl; /* time to live */
uint8_t ip_p; /* protocol */
uint16_t ip_sum; /* checksum */
uint32_t ip_src, ip_dst; /* source and dest address */
};
typedef struct iphdr iphdr;

正在提供的输入数据结构。

struct fe_context{
char *pkt; /* Pointer to packet */
size_t len; /* Length of packet */
void *if_in; /* Incoming interface - handle */
};
typedef struct fe_context fe_context;

我如何绑定(bind)读取数据的示例代码。

int fe_process(fe_context *c)
{
printf("\n\nPacket received!\n");
printf("memcpy to header structs:\n");
ethhdr * ethh = (ethhdr *) malloc(sizeof(ethhdr));
iphdr * iph = (iphdr *) malloc(sizeof(iphdr));
memcpy(ethh, c->pkt, sizeof(ethhdr));
memcpy(iph, c->pkt+sizeof(ethhdr), sizeof(ethhdr));

printf("MAC SA: %02x:%02x:%02x:%02x:%02x:%02x\n", ethh->sa[0], ethh->sa[1], ethh->sa[2],
ethh->sa[3], ethh->sa[4], ethh->sa[5]);
printf("MAC P: %04x\n", ntohs(ethh->pt));

printf("IP Ver: %x\n", ntohl(iph->ip_v));
printf("IP IHL: %x\n", ntohl(iph->ip_hl));
printf("IP TTL: %i\n", iph->ip_ttl);
printf("IP Checksum: %x\n", ntohl(iph->ip_sum));
printf("IP SRC: %08x\n", ntohl(iph->ip_src));
printf("IP DST: %08x\n", ntohl(iph->ip_dst));

char * cp = c->pkt;
printf("\nPacket read by char:\n");
char data;
int p;
for(p = 0; p < 52; p++) {
data = *cp;
cp++;
printf("%02x", data);
if(p%2==1) {
printf(" ");
}
}
printf("\n\n");
cp = c->pkt;
printf("Packet read by uint16_t:\n");
uint16_t data16;
for(p = 0; p < 52/2; p++) {
data16 = *cp;
cp+=2;
printf("%04x ", ntohs(data16));
}
printf("\n\n");
cp = c->pkt;
printf("Packet read by uint32_t:\n");
uint32_t data32;
for(p = 0; p < 52/4; p++) {
data32 = *cp;
cp+=4;
printf("%08x ", ntohl(data32));
}
printf("\n\n");

return 0;
}

这是带有上述测试数据输入的输出。

Packet received!
memcpy to header structs:
MAC SA: 02:00:00:00:00:12
MAC P: 0800
IP Ver: 4000000
IP IHL: 5000000
IP TTL: 255
IP Checksum: 0
IP SRC: 0a020000
IP DST: 00000000 // It looks good up until here. this should be 0c0c0c0c

Packet read by char:
0200 0000 0002 0200 0000 0012 0800 4500 0026 17ffffffd4 ffffff81ffffffe7 ffffffff01 0000 0a02 0002 0c0c 0c0c 0000 ffffffe802 ffffffc04b 0004 3effffff89 3325 0006 ffffffddffffffef 0809

Packet read by uint16_t:
0200 0000 0000 0200 0000 0000 0800 4500 0000 1700 81ff ffff 0000 0a00 0000 0c00 0c00 0000 e8ff c0ff 0000 3e00 3300 0000 ddff 0800

Packet read by uint32_t:
02000000 00000000 00000000 08000000 00000000 81ffffff 00000000 00000000 0c000000 e8ffffff 00000000 33000000 ddffffff

正如您所看到的,结构中的数据一直很好,直到 DST IP。这可能是因为填充/数据对齐吗?通过查看读取的字符,问题似乎发生在数据的 ip header 部分?当我按字符读取时,这些“f”从哪里来?

我尝试检查 c->pkt 指针地址及其偶数。我什至不确定这是否重要?我认为自从 malloc 为我提供了它以来,它就会一直如此。读取此数据进行解析/解码的正确方法是什么?我将对此数据进行更改,因此我更愿意将数据放入整洁的结构中。

我的代码中是否有一个简单的错误,或者我的处理方式是否错误?非常感谢任何帮助!

最佳答案

我注意到您在线上犯了一个错误:

memcpy(iph, c->pkt+sizeof(ethhdr), sizeof(ethhdr));

您正在为 IP header 复制 sizeof(ethhdr) 字节,而不是您想要的 sizeof(iphdr) 字节。看来您打错字了。

关于c - 解码以太网帧和数据对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com