gpt4 book ai didi

C 程序从 Linux IP 堆栈中获取 IP header 字段的值

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:50 25 4
gpt4 key购买 nike

我正在开发一个程序,我需要知道程序中 IP header 字段的值。因为 IP header 有 20 个字节:

struct ipheader {

unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */
unsigned char ip_tos;
unsigned short int ip_len;
unsigned short int ip_id;
unsigned short int ip_off;
unsigned char ip_ttl;
unsigned char ip_p;
unsigned short int ip_sum;
unsigned int ip_src;
unsigned int ip_dst;
};

有什么方法可以知道这些字段的值在我的 C 程序中?

最佳答案

假设您的编译器没有在该结构中引入任何对齐 block (确保 CHAR_BIT 为 8 且 sizeof(struct ipheader) 为 20),您应该只能够按原样将其包含在您的代码中,然后添加如下内容:

struct ipheader *iph = (struct ipheader *)blk;
printf ("TTL = %d\n", iph->ip_ttl);

在该代码中,您将拥有一个由blk 指向的IP header ,它可能是一个char*。将其转换为正确的指针类型将使您能够轻松访问这些字段。

下面的完整程序展示了这一点:

#include <stdio.h>
#include <limits.h>

struct ipheader {
/* 0 */ unsigned char ip_hl:4, ip_v:4;
/* 1 */ unsigned char ip_tos;
/* 2 */ unsigned short int ip_len;
/* 3 */ unsigned short int ip_id;
/* 4 */ unsigned short int ip_off;
/* 5 */ unsigned char ip_ttl;
/* 6 */ unsigned char ip_p;
/* 7 */ unsigned short int ip_sum;
/* 8 */ unsigned int ip_src;
/* 9 */ unsigned int ip_dst;
};

int main (void) {
char blk[] = {
'\x00','\x11','\x22','\x22','\x33','\x33','\x44','\x44',
'\x55','\x66','\x77','\x77','\x88','\x88','\x88','\x88',
'\x99','\x99','\x99','\x99'
};
struct ipheader *iph = (struct ipheader *)(&blk);

printf ("TTL = %x\n", iph->ip_ttl);
printf ("sum = %x\n", iph->ip_sum);
printf ("dst = %x\n", iph->ip_dst);

return 0;
}

输出如预期:

TTL = 55
sum = 7777
dst = 99999999

关于C 程序从 Linux IP 堆栈中获取 IP header 字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6688909/

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