网络数据的传递

来源:互联网 发布: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
原创粉丝点击