TCP网络传输, 数据类型的问题
转载: http://blog.csdn.net/highfly591/article/details/45309239
1.采用TCP传输时, 应用层为什么要做超时重传:
tcp保证数据可靠传输,传输成功不代表被对方逻辑层成功处理,此时超时重传解决网络传输功能,但没有被逻辑层成功处理情况,
有可能是对方应用程序崩溃了,重启后可继续处理~
2.不管过程中是什么数据类型,传输到发送接口的数据必须是char *,并且最好过程中明确统计字符串的长度。
packetLen=(16+cmdInfo.length())*sizeof(char);//对于单纯的string或者qstring可以用c++自带的取长度的函数取字符串长度,如果是对于c的结构体等强制转换成char*后,拼接成的字符串,一定不要用自定义的函数取长度,必须过程中分段求和。
memcpy(cmdpacket,(char *)&dataHeadInfo,16);
memcpy(cmdpacket+16,(char *)(cmdInfo.c_str()),cmdInfo.length());
特别是用过程语言开的。比如qt下,过程中可能用qstring,std::string,到最后都要转换成char *
对于传输结构体类型的协议包头,一定不要把结构体,先转换成string,然后在连接上包体,这样传输过去之后,包头的长度已经不是你结构体的固定长度,在传输到string中时,string是根据你实际占用的长度,分配内存的。肯定小于你固定的结构体的长度。
不要
cHeadInfo为c结构体
typedef struct headStr
{
char magic[6];
char cmdCount;
int infoLen;
//unsigned long crcValue;
uint crcValue;
}*pHeadInfo,headInfo;//(6+1+1(补齐))+4+4
std::string pHeadInfo(cHeadInfo);
std::string cmdpacket=pHeadInfo.c_str;
在把结构体强制转换成char*后,其中多余的空间可能用\0填充,所以你不应该用cout,或qDebug来打印字符串,因为这样你只能打印出截至第一个\0之前的字符。
并且不要用c++自带的.length(),或者.size.统计你的字符长度,这样它也之后统计你第一个\0之前的字符(有可能是你填充的位之前),这样你就不可能发送完所有的数据
TCP网络传输, 数据类型的问题的更多相关文章
- 解决TCP网络传输“粘包”问题
当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...
- UNIX网络编程——解决TCP网络传输“粘包”问题
当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...
- 解决TCP网络传输粘包问题
很久之前就想写一写关于TCP粘包处理的文章了,无奈一直做WEB开发 没时间研究那个,拖了很久,最近要为一个客户做winform 服务器端,要用到SOCKET就发现了这个问题,这才想起来要解决. 下面用 ...
- 网络编程—代码—TCP网络传输
一.TCP:用字符流传输信息 ------------------------------------------------------------------------------ [用字符流的 ...
- 网络传输编程之TCP
网络传输编程之TCP 网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程. (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议 ...
- C#网络程序设计(3)网络传输编程之TCP编程
网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程. (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议,它提供全双工和可 ...
- 网络学习笔记(二):TCP可靠传输原理
TCP数据段作为IP数据报的数据部分来传输的,IP层提供尽最大努力服务,却不保证数据可靠传输.TCP想要提供可靠传输,需要采取一定的措施来让不可靠的传输信道提供可靠传输服务.比如:出现差错时,让发 ...
- 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造
在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...
- TCP/IP协议网络编程以及UDP和TCP之传输协议
1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...
随机推荐
- Android工具:Hierarchy Viewer
Hierarchy Viewer 用途: 即可以用来优化自己的布局,也可以用来参考别人优秀的布局 打开方式: 运行工程,然后在\android-sdk-windows\tools目录下双击hierar ...
- Codeforces Round #339 (Div. 1) C. Necklace 构造题
C. Necklace 题目连接: http://www.codeforces.com/contest/613/problem/C Description Ivan wants to make a n ...
- iOS中深拷贝、浅拷贝和retain的区别
浅拷贝:浅拷贝是对object对象的指针拷贝,让指针指向同一块内存地址,“对象永远只有一个",浅拷贝使对象的引用计数器+1.代码如下: 可以看出不可变字符串的指针指向了同一地址,并没有重新开 ...
- 时间同步Servname not supported for ai_socktype
rdate -s 129.7.1.66rdate: 129.7.1.66: Servname not supported for ai_socktype ntpdate 0.centos.pool.n ...
- 微信小程序,开发者工具更新以后wxss编译错误
出现上述错误,解决方法如下: 1.在控制台输入openVendor() : 2.清除里面的wcsc wcsc.exe 3.重启开发者工具 搞定!
- iOS:LKDBHelper实体对象映射数据库-第三方框架(在FMDB的基础上进行二次封装)
一 插件简介: 其github地址:https://github.com/li6185377/LKDBHelper-SQLite-ORM 全面支持 NSArray,NSDictionary, Mode ...
- Python Pygal绘制世界人口地图
数据集可在 https://datahub.io/JohnSnowLabs/population-figures-by-country 下载 #coding=utf-8 import json fro ...
- SqlBulkCopy-从 bcp 客户端收到一个对 colid 1 无效的列长度
经过研究,问题是因为tatatable中的colid列1的数据字段长度超过了数据表中定义的字段长度. 解决方法就是将数据库该字段的长度增大问题就解决了.
- 爪哇国新游记之七----使用ArrayList统计水果出现次数
之前学习制作了DArray,了解ArrayList就容易了. /** * 用于存储水果名及数量 * */ public class Fruit{ private String name; public ...
- Java Nio Socket通讯
Server端: #############服务器端连接请求处理############### public class MultiplexerServer implements Runnable { ...