TCP网络传输, 数据类型的问题

Posted 路之遥_其漫漫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP网络传输, 数据类型的问题相关的知识,希望对你有一定的参考价值。

转载: http://blog.csdn.net/highfly591/article/details/45309239

不管过程中是什么数据类型,传输到发送接口的数据必须是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/ip协议四

原始套接字和普通的TCP套接字有啥不同?

iscsi-分区类型

TCP端口扫描类型-隐蔽扫描和僵尸扫描

《TCP/IP具体解释》读书笔记(20章)-TCP的成块数据流

TCP和UDP协议的原理以及区别