gpt4 book ai didi

c - 读取具有特定字节顺序的 libcap 文件

转载 作者:行者123 更新时间:2023-11-30 17:14:49 27 4
gpt4 key购买 nike

我编写了一个 c-lang 程序来读取 .pcap 文件。令我困惑的是,我读取的数据与 WireShark 具有不同的字节序。

我正在研究 X86 ach,正如我所见,它是 LittleEndian。

那么,我可以用 BigEndian 读取 .pcap 文件吗?怎么办?

代码片段:

/*
* global header
*/
typedef struct{
// fileds here
} GlobalHdr;

/*
* record (packet) header
*/
typedef struct{
// fileds here
} RecordHdr;

/*
* IP v4 header
*/
typedef struct{
// fileds here
/* the options start here, if tot_len is bigger than 5*/
} Ipv4Hdr;

/*
* UDP header
*/
typedef struct{
// fileds here
} UdpHdr;


/*
* main function
*/
int main(){
FILE *srcfile = NULL; // the .pcap file
GlobalHdr g_hdr = {0};
RecordHdr r_hdr = {0};
Ipv4Hdr ip_hdr = {0};
UdpHdr u_hdr = {0};
unsigned long fl_len = 0;
unsigned long index = 0;
unsigned char sizghdr = sizeof(GlobalHdr);
unsigned char sizrhdr = sizeof(RecordHdr);
unsigned char sizihdr = sizeof(Ipv4Hdr);
unsigned char sizuhdr = sizeof(UdpHdr);

srcfile = fopen (SRC_FILE, "r");
if(!srcfile){
PERR ("source file opening");
}

fseek (srcfile, 0, SEEK_END);
fl_len = ftell (srcfile);
fseek (srcfile, 0, SEEK_SET);
printf ("file length: %ld\n", fl_len);

// read file global header

CHECK_POSITION (sizghdr);
if(!fread (&g_hdr, sizghdr, 1, srcfile)){
PERR ("reading global header");
}
print_ghdr (&g_hdr);

// read blocks

while(1){
// read block header
CHECK_POSITION (sizrhdr);
if(!fread (&r_hdr, sizrhdr, 1, srcfile)){
PERR ("reading block header");
}
print_rhdr (&r_hdr);

// read ethernet header
CHECK_POSITION (LINK_LAYER_LEN);
fseek (srcfile, index, SEEK_SET);

// read IP header
CHECK_POSITION (sizihdr);
if(!fread (&ip_hdr, sizihdr, 1, srcfile)){
PERR ("reading ip header");
}
print_iphdr (&ip_hdr);

// read UDP header
CHECK_POSITION (sizuhdr);
if(!fread (&u_hdr, sizuhdr, 1, srcfile)){
PERR ("reading upd header");
}
print_udphdr (&u_hdr);

// read contained data
CHECK_POSITION (r_hdr.orig_len - sizrhdr
- LINK_LAYER_LEN - sizihdr - sizuhdr
);
fseek (srcfile, index, SEEK_SET);
}

// clean up

puts ("Done!");
CLEAN_UP;
return 0;
}

最佳答案

So, can I read the .pcap file with BigEndian?

是的。

How?

  1. 使用 libpcap/WinPcap,而不是编写自己的代码来读取它,因为 libpcap/WinPcap 会为您处理字节顺序问题;
  2. 查看魔数(Magic Number)以确定文件的字节顺序是否与读取该文件的主机的字节顺序相同或相反,如果是相反的字节顺序,则对 16 位和 32 位进行字节交换整数。

请注意,数据包数据(某些元数据 header 除外,例如 USB 元数据)按照其在网络上出现的字节顺序排列,而不是字节顺序主机写入数据的顺序。例如,IP 和 TCP header 中的 16 位和 32 位整数值始终为大端字节序,以太网类型字段也是如此。

关于c - 读取具有特定字节顺序的 libcap 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30173497/

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