处理TCP连包的一小段代码
学习网络编程也有一段时间了,一直听说TCP数据会连包,但一直不知道怎么测试好。最近测试了下:发送方使用对列,将发送的数据存入队列,然后开线程,专门发送。发送多包数据之间不延时。在接收方,他们确实连在一起了。花了点时间,写了一小段代码解决这个问题,其实一共也就4个函数:
#define FIND_NO_HEAD 1024 int MyTcpSock::GetPackageSetedLength(char *pHeader)
{
XX_NETPACKET_HEADER *pNetHeader = (XX_NETPACKET_HEADER *)pHeader; return (sizeof(XX_NETPACKET_HEADER) + pNetHeader->packetsize);
} int MyTcpSock::FindHeaderFlag(char *buf,int len)
{
#define FLAGS_NUM 4 int count = ;
char i=;
unsigned char Flags[FLAGS_NUM] = {XX_FLAG1,XX_FLAG2,XX_FLAG3,XX_FLAG4};
XX_NETPACKET_HEADER *pHeader = (XX_NETPACKET_HEADER *)(buf+count); while(count < len)
{
for(i=;i<FLAGS_NUM;i++)
{
if(pHeader->flag == Flags[i])
{
return ((char *)pHeader - buf);
}
} count ++;
pHeader = (XX_NETPACKET_HEADER *)(buf+count);
} return FIND_NO_HEAD;
} void MyTcpSock::ResolveRecievedData(char *buf,int len)
{
char *pUnreslovedData = (char *)buf; //指向待解析的数据的开始
int iUnreslovedDataLen = len; //待解析的数据的长度
int iHeaderPosition = ; //数据头的位置--相对于待解析的数据的起始位置
int iPackageLen = ; //解析出的命令的数据包长度 while(iUnreslovedDataLen > )
{
iHeaderPosition = FindHeaderFlag(pUnreslovedData,iUnreslovedDataLen);
if(iHeaderPosition == FIND_NO_HEAD)
{
TRACE("Find no Header!\n");
Printf(pUnreslovedData,iUnreslovedDataLen);
return ;
}
iPackageLen = this->GetPackageSetedLength((char *)(pUnreslovedData+iHeaderPosition));
if(iPackageLen > iUnreslovedDataLen)
{
TRACE("Package is not full!\n");
Printf(pUnreslovedData,iUnreslovedDataLen);
return ;
} ResolvePackageCmd((char *)(pUnreslovedData+iHeaderPosition),iPackageLen); pUnreslovedData = pUnreslovedData + iHeaderPosition + iPackageLen; //调整指针
iUnreslovedDataLen = iUnreslovedDataLen - iHeaderPosition - iPackageLen;
}
} void MyTcpSock::ResolvePackageCmd(char *buf,int len)
{
XX_NETPACKET_HEADER *pNetHeader = (XX_NETPACKET_HEADER *)buf; //XXX后面就是命令的解析了
}
以上代码是C++,去掉类就是C。以上代码经过测试,可以解决如下问题:
数据连包的问题。
数据发送丢失,比如有包头却丢失了一些数据。后面解析这些命令时,如果以为数据存在,直接用将会出现不可预知的错误。
命令包格式的设计,基本要遵守CLV的格式,C-code命令,L-Length命令长度,V-Value值。
这里的命令也基本上就是上面的Flag,因为不通命令可能带的值不一样,所以也就必须定义此命令的长度。这在连包处理上非常重要。
处理TCP连包的一小段代码的更多相关文章
- 关于PHP的一小段代码求解如下求解"%2\$s"
<?php$format = "The %2\$s contains %1\$d monkeys";printf($format, 8, "北京");?& ...
- 假设写一段代码引导PC开机这段代码是 ? Here is a tiny "OS" :-D
Hello world -- OS 我找到了华科绍志远博士的相关代码,发现他依据MIT的JOS的boot.S 稍作改动.然后单独剥离出来,能够非常好玩~ 资料下载地址: http://download ...
- Netty TCP粘包/拆包问题《一》
1.使用LineBasedFrameDecoder,StringDecoder解析器进行解决TCP粘包/拆包问题 2.代码搞起: TimeClient:客户端 /* * Copyright 2013- ...
- TCP粘包处理通用框架--C代码
说明:该文紧接上篇博文“ linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现 ”讲来 (1)TCP粘包处理数据结构设计 #define MAX_MSG_LEN 65535 ty ...
- TCP粘"包"问题浅析及解决方案Golang代码实现
一.粘"包"问题简介 在socket网络编程中,都是端到端通信,客户端端口+客户端IP+服务端端口+服务端IP+传输协议就组成一个可以唯一可以明确的标识一条连接.在TCP的sock ...
- [置顶] NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析--吐血放送
NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析,限于个人水平,如有错误请留言指出! TcpSink类的recv()方法: void TcpSink::recv(Packet ...
- 6行代码解决golang TCP粘包
转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现 ...
- TCP数据包的封包和拆包
//该段博文为引用,非原创. 封包和拆包 作者:fengge8ylf 博客:http://blog.csdn.net/fengge8ylf 对于基于TCP开发的通讯程序,有个很重要的问题需要解决,就 ...
- (经典)tcp粘包分析
转载自csdn:http://blog.csdn.net/zhangxinrun/article/details/6721495 这两天看csdn有一些关于socket粘包,socket缓冲区设置的问 ...
随机推荐
- 数据结构1 「在线段树中查询一个区间的复杂度为 $O(\log N)$」的证明
线段树属于二叉树, 其核心特征就是支持区间加法,这样就可以把任意待查询的区间$[L, R]$分解到线段树的节点上去,再把这些节点的信息合并起来从而得到区间$[L,R]$的信息. 下面证明在线段树上查询 ...
- Mybatis 如何自动生成bean dao xml 配置文件 generatorconfig.xml (main()方法自动生成更快捷)
最近项目要用到mybatis中间件,中间涉及到要对表结构生成bean,dao,和sqlconfig.xml 所以记录一下学习过程 首先是准备工作,即准备需要的jar包:我们的数据库mysql,所以驱动 ...
- Spoj-BOKAM143SOU Checking cubes.
Given a integer N. Find number of possible ways to represent N as a sum of at most five cubes. Input ...
- Hibrenate load 和 get
这次我们来谈一下Hibernate3.2 Session加载数据时get和load方法的区别(Hibernate 3以后的版本就用get()方法取代find()这个方法了),其实这个在网上有很多的论述 ...
- 另一篇xtion、kinect选择比较(openni下)
小小Xtion开箱测评!!2012年03月12日 19:52:55 原文:http://page.renren.com/601107241/note/811764499 ASUS Xtion Pro ...
- HDD磁盘,非4K无以致远
机械硬盘的未来要靠高容量作为依托,在财报中,希捷表示未来18个月内它们将推出14和16TB机械硬盘,而2020年20TB机械硬盘就将诞生.也有资料显示,3.5英寸100TB硬盘大概在2025年就能面世 ...
- HDC与CDC相互转换
转自loop_k原文 HDC与CDC相互转换 概念 首先说一下什么是DC(设备描述表):Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(Device Context, DC) ...
- 通过Python实现自动填写调查问卷
0X00 前言 快开学了,看到空间里面各种求填写调查问卷的,我才想起来貌似我也还没做.对于这种无意义的问卷,我是不怎么感冒的,所以我打算使用”特技”来完成,也就是python,顺便重新复习一下pyth ...
- javaweb 中的过滤器 包装器
过滤器要做的事情: 请求过滤器:完毕安全检查,又一次格式化请求首部或体.建立请求审计或日志 响应过滤器: 压缩响应流,追加或改动响应流创建一个全然不同的响应. 过滤器和servlet三个相似地 ...
- CMS - 认识目录
Tips:如果网页图片(文字)看不清,请按CTRL+鼠标滚轮 一个完整的小程序模板目录结构如下! 本章节给出的建议: 1.推荐使用flex布局 2.其它图片路径建议引入网络路径(tabBar不支持网络 ...