主机字节序和网络字节序
来源:互联网 发布:沈阳北方软件学院 编辑:程序博客网 时间:2024/05/17 03:22
1. 主机字节序和网络字节序1
主机字节序和网络字节序
//以下是从ip.h和tcp.h取的,但BSD和LINUX用的名称有些不一样主要是TCP不一样
/*
struct ip
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ip_hl:4; //little-endian IP头长度(单位为32位)4位
unsigned int ip_v:4; //版本号4 IP4用4
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned int ip_v:4; // version
unsigned int ip_hl:4; // header length
#endif
u_int8_t ip_tos; //服务类型 一般为0
u_short ip_len; //数据总长度 (单位为32位)
u_short ip_id; //标识16
u_short ip_off; //分段偏移
#define IP_RF 0x8000 // reserved fragment flag //标志
#define IP_DF 0x4000 // dont fragment flag
#define IP_MF 0x2000 // more fragments flag
#define IP_OFFMASK 0x1fff // mask for fragmenting bits
u_int8_t ip_ttl; //生存时间
u_int8_t ip_p; //传输协议 tcp是6
u_short ip_sum; //头校验和
struct in_addr ip_src, ip_dst; // 源地址 目标地址
};
struct tcphdr
{
u_int16_t source; // 源端口
u_int16_t dest; // 目的端口
tcp_seq seq; // 序号
tcp_seq ack_seq; // 确认号 收到的TCP信息的序号+1
#if __BYTE_ORDER == __LITTLE_ENDIAN
u_int16_t res1:4; //保留
u_int16_t doff:4; //保留
u_int16_t fin:1; //标志 结束
u_int16_t syn:1; //标志 同步
u_int16_t rst:1; //标志 重置
u_int16_t psh:1; //标志 入栈
u_int16_t ack:1; //标志 确认
u_int16_t urg:1; //标志 紧急
u_int16_t res2:2;
#elif __BYTE_ORDER == __BIG_ENDIAN
u_int16_t doff:4;
u_int16_t res1:4;
u_int16_t res2:2;
u_int16_t urg:1;
u_int16_t ack:1;
u_int16_t psh:1;
u_int16_t rst:1;
u_int16_t syn:1;
u_int16_t fin:1;
#else
#error "Adjust your <bits/endian.h> defines"
#endif
u_int16_t window; //窗口
u_int16_t check; //校验和
u_int16_t urg_ptr; //紧急指针
};
*/
我所理解的big序和little序的区别:
1:存整数的时候
Uint32_t a=1574;//1574=0x626
Big序:00000110 00100110也就是0x0626
Little序存的时候是(按bit):00100110 00000110 也就是0x2606
通过函数(linux/byteorder/generic.h中定义的):
unsigned long int htonl (unsigned long int hostlong);
unsigned short int htons (unsigned short int hostshort);
unsigned long int ntohl (unsigned long int netlong);
unsigned short int ntohs (unsigned short int netshort);
即可实现主机序到网络序的转换,实际上的函数就是先判断cpu是否是little序的,不是不执行任何操作,因为big序本来就是网络序,是little序的话就以字节为单位执行前后颠倒就行了。
另外用注意,数字所占位数小于或等于一个字节(8 bits)时,不要用htons转换。这是因为对于主机来说,大小尾端的最小单位为字节(byte)。
2:用位段分配空间时:
Big序:
unsigned int ip_v:4; // version
unsigned int ip_hl:4; // header length
ip_v=4;
ip_hl=5;
则内存实际存法是:01000101
因为big序是从前面开始分配的
little序:
unsigned int ip_hl:4; //little-endian IP头长度(单位为32位)4位
unsigned int ip_v:4; //版本号4 IP4用4
ip_v=4;
ip_hl=5;
则内存实际存法是:01000101
因为little序是从前后开始分配的。
这样就实现了发送包的时候统一以网络序发送。
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 主机字节序和网络字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 网络字节序和主机字节序
- 主机字节序和网络字节序
- 网络字节序和主机字节序
- 主机字节序和网络字节序
- 网络字节序和主机字节序
- 主机字节序和网络字节序
- linux自动装载Windows下的分区以及bash启动脚本自定义命令
- perl 调试
- 动态跟踪循环体 避免“假死”
- 优秀的软件模型设计要点
- linux perl 批量替换文件内容
- 主机字节序和网络字节序
- 给你这么个数列
- ss整合问题
- 时钟问题--领会全排列算法
- linux书籍推荐
- 1的个数
- nim游戏
- 总结操作系统进程管理部分知识
- 总结操作系统进程管理部分知识