在C中创建IP标头

时间:2013-10-13 14:08:56

标签: c struct header ip

我试图在C中创建IP标头。

typedef struct header
{
    //IP-Header
    unsigned char ip_v:4, ip_hl:4;/* this means that each member is 4 bits */
    unsigned char ip_tos;       //1 Byte
    unsigned short int ip_len;  //2 Byte
    unsigned short int ip_id;   //2 Byte
    unsigned short int ip_off;  //2 Byte
    unsigned char ip_ttl;       //1 Byte
    unsigned char ip_p;         //1 Byte
    unsigned short int ip_sum;  //2 Byte
    unsigned int ip_src;        //4 Byte
    unsigned int ip_dst;        //4 Byte


} __attribute__((packed)) ipheader;

现在我想使用struct并在变量中保存十六进制值。

int main()
{
    ipheader iph;

    iph.ip_v='\x4';
    iph.ip_hl='\x5';
    iph.ip_tos='\x00';

    return 0;
}

如何将 103C写入iph.ip_len ?这种结构是存储IP头的好方法吗?

3 个答案:

答案 0 :(得分:2)

如何使用iphdr结构?

除此之外,您应该注意关于字节顺序(请参阅ntohlhtonl函数),具体取决于您要对其中的数据执行的操作(您没有说)。另请参阅why endianess matters among bits inside a byte?关于iphdr中的endianess。

为了自己编写值,您可以使用您使用的标准/编译器允许的任何格式,例如:二进制文字,如果您使用正确的GCC版本与适当的标志,或八进制,或十进制,或字符数组,或...

以下是不同文字格式的一些示例:

十六进制:0x103C

字符数组:(char *){ 10, 60 }(char *){ 10, '<' }

八进制:010074

二进制:0b1000000111100

如果你不在不同类型之间移动值或者用它们做一些时髦的数学运算,你甚至不需要演员 - 否则编译器会将这些值解释为int,这可能是一个你的问题,特别是因为签名不同。在这种情况下,只需要前缀(uint16_t)或您需要的任何内容(您应该使用系统中定义的相同类型 - 请参阅我的答案顶部的iphdr建议 - 或固定长度定义,以避免出现可移植性问题或未来更新的问题)

答案 1 :(得分:0)

您只需为其指定值:

iph.ip_len = (unsigned short int)0x103C;

您实际分配为其他角色的其他人。我不确定你是不是有意。

因此,在iph.ip_v='\x4'中,'\x4'实际上表示一个字符,然后将其分配给ip_v成员(截断为4位)。但你可以写iph.ip_v=0x04

答案 2 :(得分:0)

使用:

unsigned char ip_hl:4, ip_v:4;


int ip_vhl; // version and header togather
#define IP_HL(ip) (((ip)->ip_vhl) & 0x0f) //split header length
#define IP_V(ip) (((ip)->ip_vhl) >> 4) //split IP version