请参阅/netinet/tcp.h中的TCP报头定义:
struct tcphdr
{
u_int16_t th_sport; /* source port */
u_int16_t th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
# if __BYTE_ORDER == __LITTLE_ENDIAN
u_int8_t th_x2:4; /* (unused) */
u_int8_t th_off:4; /* data offset */
# endif
# if __BYTE_ORDER == __BIG_ENDIAN
u_int8_t th_off:4; /* data offset */
u_int8_t th_x2:4; /* (unused) */
# endif
u_int8_t th_flags;
# define TH_FIN 0x01
# define TH_SYN 0x02
# define TH_RST 0x04
# define TH_PUSH 0x08
# define TH_ACK 0x10
# define TH_URG 0x20
u_int16_t th_win; /* window */
u_int16_t th_sum; /* checksum */
u_int16_t th_urp; /* urgent pointer */
};为什么8位字段的字节顺序不同?我认为只有16位和32位字段与字节顺序有关,您可以分别使用ntohs和ntohl在字节顺序之间进行转换。用来处理8位数据的函数是什么?如果没有,那么在小端机器上使用此头的TCP似乎不能与大端机器上的TCP一起工作。
发布于 2009-05-14 15:42:27
有两种顺序。一个是字节顺序,一个是位域顺序。在C语言中,位字段的顺序没有标准的顺序。这取决于编译器。通常,位字段的顺序在大端和小端之间颠倒。
发布于 2009-05-14 15:43:42
这是依赖于编译器且不可移植的。位字段的顺序取决于实现,这里使用8位字段和移位/掩码来获得子字段会好得多。
发布于 2009-05-14 15:43:25
在这台机器中,字节顺序也可能指的是位顺序和字节顺序。This wikipedia article提到,有时会出现这种情况。
https://stackoverflow.com/questions/864077
复制相似问题