网络数据的传递
来源:互联网 发布:c语言编写的聊天程序 编辑:程序博客网 时间:2024/05/21 17:35
/*
网络之间整数,浮点数,非数值信息的传递:
1.基本缓存整数传递:
写入应用缓存会放到协议缓存时候:
memcpy读入字符信息。
布尔类型
byte类型直接写入。
整型:
htons
htonl
htonll转换大小端后写入。
读取应用缓存来自协议缓存时候:memcpy截取字符串的数据。
类型转换:
布尔Byte直接读取
整型:多字节组成需要转换
ntohs
ntohl
ntohll
64位整数的主机-网络大小端转换:
uint64_t MsgData::htonll(uint64_t val)
{
return (uint64_t)htonl((uint32_t)val)<<32 + htonl(val>>32);
// 总结位移运算是对地址上的16进制的二进制值移动,不涉及存储大小端和地址;复杂算法举例说明即可。
// 0xaa00bb00 cc00dd00不用考虑大小端,在十六进制值上截取32位得0xcc00dd00,对32位转换为大端变为0x00dd00cc再转换为64位为0x00000000 00dd00cc
// 左边移动32位得0x00dd00cc 00000000; 右边直接右移32位为0x00000000 aa00bb00,隐形转换为long 4byte为0xaa00bb00,转换为网络字节为:0x00bb00aa
// 两个数相加得:0x00dd00cc 00bb00aa
}
uint64_t MsgData::ntohll( uint64_t val )
{
uint64_t t = (uint64_t)ntohl((uint32_t)val)<<32;// 原来的低位转换为高位,先截取,字节顺序调换,左移动变高位腾出低位空间
uint64_t tt = ntohl(val>>32);// 截取原来的高位,转换为字节顺序
return t + tt; // 原来的高位合并到低位转换的字节中。
//return (uint64_t)ntohl((uint32_t)val)<<32 + ntohl(val>>32);
}
2.浮点数:
浮点数的发送:因为网络通信两端的机器位数或者浮点数标准不同,
因此浮点数的发送和接收都是转换为char[]来做(可以用sprintf),到了服务端在atof。
3.字符流和图片视频音频:
字符串发送时候先写入长度,长度转换为short类型,需要htons,然后写入字符串的字节编码流没有大小端,
来自std::string或者字符数组,写入时候memcpy到应用程序的发送缓存即可。
字符串,先读取长度,然后memcpy,因为是字符串流是单个字节单位编码的没有大小端。
读取长度,赋值给std::string或者字符数组即可。
图片视频的发送:
也是直接发送字符流即可,如果直接传送完毕用其它软件打开比较容易,
但是收发双方都要显示缩略图或者边观看边下载,或下载完毕后软件自己打开播放就需要编解码,比较复杂。
by Jesse Cen[2015.2.12]
*/
0 0
- 网络数据的传递
- 网络数据传递之数据的发送
- 链路层到网络层的数据传递
- 链路层到网络层的数据传递
- 网络编程数据传递技巧
- 传递网络数据避免字节序的一个技巧
- 详解GIT网络传递数据的加密解密过程
- 网络数据传递之 Json数据解析
- 数据链层到网络层数据传递
- 数据传递的郁闷
- DWR的数据传递
- DWR的数据传递
- Intent传递的数据
- MFC数据的传递
- Intent的数据传递
- 控制器的数据传递
- Intent数据的传递
- Intent的数据传递
- 设计模式分类
- 黑马程序员--07 OC 三大特性
- PAT 1017. A除以B
- Redis 高可用性部署
- 【Android入门 十三】数据存储
- 网络数据的传递
- ubuntu 14.04 安装genymotion
- hdu 1829 A Bug's Life 并查集
- Android Studio 安装、设置、快捷键
- 从服务端加载图片(ImageLoader+AsyncTask)
- 题目1477:怪异的洗牌
- codeforce295# B
- 创建型设计模式
- 图论专题小结:最大流算法之ISAP算法