代码目的不明确?
Unclear purpose of code?
我正在 Linux 中学习原始套接字编程,在教程中我注意到与这段代码的巧合:
struct ipheader {
unsigned char iph_ihl:5, iph_ver:4; //<--------------These
unsigned char iph_tos;
unsigned short int iph_len;
unsigned short int iph_ident;
unsigned char iph_flag;
unsigned short int iph_offset;
unsigned char iph_ttl;
unsigned char iph_protocol;
unsigned short int iph_chksum;
unsigned int iph_sourceip;
unsigned int iph_destip;
};
iph_ver
保存 IP 版本,即 4,iph_ihl
保存 header 长度,将设置为 5。由于 header 长度在中描述4 字节字,实际 header 长度为 5×4=20 字节。 20 个字节是最小长度。话虽如此,我很好奇此结构中为 iph_ver
和 iph_ihl
设置的位字段是否具体为 4 和 5,因为它将是 IPv4 而 IP header 将为 20字节长度。但是我不确定它们的位字段如何对其值产生任何影响或相关性。任何解释将不胜感激。
本教程中的代码片段实际上是错误的!
这里是IP数据包的正确定义header:
/*
* Structure of an internet header, naked of options.
*
* We declare ip_len and ip_off to be short, rather than u_short
* pragmatically since otherwise unsigned comparisons can result
* against negative integers quite easily, and fail in subtle ways.
*/
struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN
u_char ip_hl:4, /* header length */
ip_v:4; /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
u_char ip_v:4, /* version */
ip_hl:4; /* header length */
#endif
u_char ip_tos; /* type of service */
short ip_len; /* total length */
u_short ip_id; /* identification */
short ip_off; /* fragment offset field */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
u_char ip_ttl; /* time to live */
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};
如您所见,ip_hl
和 ip_v
都是 4 位宽的位域。字段的实际名称并不重要,重要的是它们在数据包中的位置 header.
它们以不同的顺序定义,具体取决于平台,因为编译器根据字节顺序分配不同的位域。这种行为实际上没有在 C 标准中指定,但似乎跨平台是一致的。
我正在 Linux 中学习原始套接字编程,在教程中我注意到与这段代码的巧合:
struct ipheader {
unsigned char iph_ihl:5, iph_ver:4; //<--------------These
unsigned char iph_tos;
unsigned short int iph_len;
unsigned short int iph_ident;
unsigned char iph_flag;
unsigned short int iph_offset;
unsigned char iph_ttl;
unsigned char iph_protocol;
unsigned short int iph_chksum;
unsigned int iph_sourceip;
unsigned int iph_destip;
};
iph_ver
保存 IP 版本,即 4,iph_ihl
保存 header 长度,将设置为 5。由于 header 长度在中描述4 字节字,实际 header 长度为 5×4=20 字节。 20 个字节是最小长度。话虽如此,我很好奇此结构中为 iph_ver
和 iph_ihl
设置的位字段是否具体为 4 和 5,因为它将是 IPv4 而 IP header 将为 20字节长度。但是我不确定它们的位字段如何对其值产生任何影响或相关性。任何解释将不胜感激。
本教程中的代码片段实际上是错误的!
这里是IP数据包的正确定义header:
/*
* Structure of an internet header, naked of options.
*
* We declare ip_len and ip_off to be short, rather than u_short
* pragmatically since otherwise unsigned comparisons can result
* against negative integers quite easily, and fail in subtle ways.
*/
struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN
u_char ip_hl:4, /* header length */
ip_v:4; /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
u_char ip_v:4, /* version */
ip_hl:4; /* header length */
#endif
u_char ip_tos; /* type of service */
short ip_len; /* total length */
u_short ip_id; /* identification */
short ip_off; /* fragment offset field */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
u_char ip_ttl; /* time to live */
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};
如您所见,ip_hl
和 ip_v
都是 4 位宽的位域。字段的实际名称并不重要,重要的是它们在数据包中的位置 header.
它们以不同的顺序定义,具体取决于平台,因为编译器根据字节顺序分配不同的位域。这种行为实际上没有在 C 标准中指定,但似乎跨平台是一致的。