转载: 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网络传输, 数据类型的问题的更多相关文章

  1. 解决TCP网络传输“粘包”问题

    当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...

  2. UNIX网络编程——解决TCP网络传输“粘包”问题

    当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...

  3. 解决TCP网络传输粘包问题

    很久之前就想写一写关于TCP粘包处理的文章了,无奈一直做WEB开发 没时间研究那个,拖了很久,最近要为一个客户做winform 服务器端,要用到SOCKET就发现了这个问题,这才想起来要解决. 下面用 ...

  4. 网络编程—代码—TCP网络传输

    一.TCP:用字符流传输信息 ------------------------------------------------------------------------------ [用字符流的 ...

  5. 网络传输编程之TCP

    网络传输编程之TCP   网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程.     (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议 ...

  6. C#网络程序设计(3)网络传输编程之TCP编程

        网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程.     (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议,它提供全双工和可 ...

  7. 网络学习笔记(二):TCP可靠传输原理

      TCP数据段作为IP数据报的数据部分来传输的,IP层提供尽最大努力服务,却不保证数据可靠传输.TCP想要提供可靠传输,需要采取一定的措施来让不可靠的传输信道提供可靠传输服务.比如:出现差错时,让发 ...

  8. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

  9. TCP/IP协议网络编程以及UDP和TCP之传输协议

    1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...

随机推荐

  1. RestFramework

    什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审 ...

  2. [CodeForces-759D]Bacterial Melee

    题目大意: 有一串n个字母,每个位置的字母可以同化边上的一个字母, 比如:ab可以变成aa或者bb. 相对的两个同化不能同时发生,比如ab不能变成ba. 现在给你一个字符串,问你经过任意次数的同化过程 ...

  3. nginx配置本地https

    客户端如何验证服务器的证书呢?服务器自己的证书必须经过某"权威"证书的签名,而这个"权威"证书又可能经过更权威的证书签名,这么一级一级追溯上去,最顶层那个最权威 ...

  4. Eclipse运行Maven的SpringMVC项目Run on Server时出现错误:Error configuring application listener of class org.springframework.web.context.ContextLoaderListener的问题解决

    错误: 严重: Error configuring application listener of class org.springframework.web.context.ContextLoade ...

  5. Notepad++ v5.5以上 惯用法教程

    注:本文中为注明为自定义快捷键的,均为notepad++的默认快捷键. 0.  关闭标签页 UltraEdit是双击窗口就可以关闭,Notepad++双击不能关闭,右键只能关闭非当前标签页,那怎么办呢 ...

  6. Android显示GIF动画 GifView

    android中显示gif动画原生态一般支持的不是很好,故找了一个开源的项目,现简单介绍如下: GifView 是一个为了解决android中现在没有直接显示gif的view,只能通过mediapla ...

  7. jquery动态添加表单数据

    动态添加用户 实现代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html ...

  8. MLP 之手写数字识别

    0. 前言 前面我们利用 LR 模型实现了手写数字识别,但是效果并不好(不到 93% 的正确率). LR 模型从本质上来说还只是一个线性的分类器,只不过在线性变化之后加入了非线性单调递增 sigmoi ...

  9. Git系列一之安装管理

    1.Git安装部署 Git是分布式的版本控制系统,我们只要有了一个原始Git版本仓库,就可以让其他主机克隆走这个原始版本仓库,从而使得一个Git版本仓库可以被同时分布到不同的主机之上,并且每台主机的版 ...

  10. centos7 安装selenium和firefox

    之前有一篇文章介绍过在ubuntu下安装selenium和firefox 现在介绍下centos7 注意以下都是下载的linux64位的软件,32位的请自己找下链接, 现在使用的python的版本是3 ...