网络数据(socket)传输总结

简介: 环境限定:TCP/IP下的socket网络传输;C/C++开发语言,32/64位机。 目前有两种方式对数据进行传输:1)字符流形式,即将数据用字符串表示;2)结构型方式,即将数据按类型直接传输。 1)的方式保证所有的数据都是清晰的字符串明文,没有平台不一致问题,但传输的数据不定长,复合数据类型(如struct)的解析不方便。

环境限定:TCP/IP下的socket网络传输;C/C++开发语言,32/64位机。

目前有两种方式对数据进行传输:1)字符流形式,即将数据用字符串表示;2)结构型方式,即将数据按类型直接传输。

1)的方式保证所有的数据都是清晰的字符串明文,没有平台不一致问题,但传输的数据不定长,复合数据类型(如struct)的解析不方便。
2)的方式保证数据长度固定/可控,方便对接受到数据的解析;但前提是要考虑平台不一致问题,如字节序、对齐位宽、数据类型等;


两种数据传输方式应用时的注意点:
1)字符流形式 -- 需要协商好数据的解析方式,考虑到数据不定长可能导致的问题。
2)结构形式 -- 主要注意平台不一致导致的问题。


字符流传输方式相对简单、安全,以结构方式传输则不同。结构形式传输数据时,要检查下面各点:
1)首先要清楚是否有机器位宽不一致的情况,如32位机和64位机。如果位宽不一致,则避免传输表示方式不一致的数据类型,如long、float型在32位了64位下表示方式不一致,会导致数据解析错误。
2)确认通信双方的对齐位宽一致,或自己保证传输的数据结构在对齐调整后不会产生大小不一致。如果收发双方的对齐方式分别是按4和8字节对齐,则需要在程序中明确制定对齐位宽;或者调整数据的结构,确保在对齐调整后,收/发的数据中每一项的偏移量一致。
3)尽量对发出去的数据都转换成网络字节序,接收后转换回本地字节序,特别是机器字节序不一致时,现有的字节序转换函数不能满足所有需求。
4)某些数据类型的表示方式有不同,如浮点数(一般用IEEE 794标准),不能认为正确的传了一个字节序正确的8字节double型就对了,不同平台对double型的表示方式不同,比如发送1.003,接受没问题,结果却得到了其它的数值。

传结构型数据时对字节序和浮点数的处理,以下的两点网上的资料不多,详细记录一下:
1)目前没有对8字节或以上数据类型的转换函数,需要自己实现,网上有很多,下面例举一个:
uint64_t htonll(uint64_t n) {
return (((uint64_t)htonl(n)) << 32) | htonl(n >> 32);
}
uint64_t ntohll(uint64_t n) {
return (((uint64_t)ntohl(n)) << 32) | ntohl(n >> 32);
}
如果有更长的数据(12字节...),以此类推。

2)对浮点数之类的数据,如果要完全准确,那么用字符串发送。如果直接传数据,仍要处理字节序,同时确保收发双方对浮点数的表示方式一致。下面是两个double型的字节序转换函数:
double ntoh_double(double net_double) {
uint64_t host_int64;
host_int64 = ntohll(*((uint64_t *) &net_double));
return *((double *) &host_int64);
}

double hton_double(double host_double) {
uint64_t net_int64;
net_int64 = htonll(*((uint64_t *) &host_double));
return *((double *) &net_int64);
}
上述函数之所以没有对host_double/net_double直接转成uint64_t时会导致数据截断。

目录
相关文章
|
3月前
|
Python
LBA-ECO CD-32 通量塔网络数据汇编,巴西亚马逊:1999-2006,V2
该数据集汇集了1999年至2006年间巴西亚马逊地区九座观测塔的碳和能量通量、气象、辐射等多类数据,涵盖小时至月度时间步长。作为第二版汇编,数据经过协调与质量控制,扩展了第一版内容,并新增生态系统呼吸等相关计算数据,支持综合研究与模型合成。数据以36个制表符分隔文本文件形式提供,配套PDF说明文件,适用于生态与气候研究。引用来源为Restrepo-Coupe等人(2021)。
40 1
|
2月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
72 4
|
3月前
|
开发者
鸿蒙仓颉语言开发教程:网络请求和数据解析
本文介绍了在仓颉开发语言中实现网络请求的方法,以购物应用的分类列表为例,详细讲解了从权限配置、发起请求到数据解析的全过程。通过示例代码,帮助开发者快速掌握如何在网络请求中处理数据并展示到页面上,减少开发中的摸索成本。
鸿蒙仓颉语言开发教程:网络请求和数据解析
|
5月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
165 22
|
5月前
|
存储 数据库 Python
利用Python获取网络数据的技巧
抓起你的Python魔杖,我们一起进入了网络之海,捕捉那些悠游在网络中的数据鱼,想一想不同的网络资源,是不是都像数不尽的海洋生物,我们要做的,就是像一个优秀的渔民一样,找到他们,把它们捕获,然后用他们制作出种种美味。 **1. 打开魔法之门:请求包** 要抓鱼,首先需要一个鱼网。在Python的世界里,我们就是通过所谓的“请求包”来发送“抓鱼”的请求。requests是Python中常用的发送HTTP请求的库,用它可以方便地与网络上的资源进行交互。所谓的GET,POST,DELETE,还有PUT,这些听起来像偶像歌曲一样的单词,其实就是我们鱼网的不同方式。 简单用法如下: ``` im
118 14
|
6月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
223 12
|
6月前
|
SQL druid 定位技术
【YashanDB知识库】查询空间数据提示This socket has been closed.
【YashanDB知识库】查询空间数据提示This socket has been closed.
|
6月前
|
SQL Java 数据库连接
【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢
由于网络带宽不足导致的jdbc向yashandb插入数据慢
|
7月前
|
缓存 小程序 API
微信小程序网络请求与API调用:实现数据交互
本文深入探讨了微信小程序的网络请求与API调用,涵盖`wx.request`的基本用法、常见场景(如获取数据、提交表单、上传和下载文件)及注意事项(如域名配置、HTTPS协议、超时设置和并发限制)。通过一个简单案例,演示了如何实现小程序与服务器的数据交互。掌握这些技能将帮助你构建功能更丰富的应用。
|
8月前
|
前端开发 小程序 Java
uniapp-网络数据请求全教程
这篇文档介绍了如何在uni-app项目中使用第三方包发起网络请求
545 3

热门文章

最新文章