zoukankan      html  css  js  c++  java
  • 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*后,其中多余的空间可能用填充,所以你不应该用cout,或qDebug来打印字符串,因为这样你只能打印出截至第一个之前的字符。

    并且不要用c++自带的.length(),或者.size.统计你的字符长度,这样它也之后统计你第一个之前的字符(有可能是你填充的位之前),这样你就不可能发送完所有的数据

  • 相关阅读:
    【数据库】事务,ACID,CAP和一致性
    线程,进程。多进程,多线程。并发,并行的区别
    mysql 集群 数据同步
    如何读取一个表的表类型,以及读取一个表中字段的类型.
    网络攻击技术开篇——SQL Injection
    MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
    程序员找工作那些事(一)幸存者偏差
    程序员
    preg_replace的一些细节
    HDU 1258 Sum It Up(dfs 巧妙去重)
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/6321884.html
Copyright © 2011-2022 走看看