/*************************************
文件名: server.c
TCP 组包和拆包实现算法
*/
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024*5
//#define TCP_PACK_DEBUG 1
int main()
{
int nBufuseLen=0; //缓冲区里用到的长度
int nRevOnceLen=0; //read 一次读到的长度
int nPackLen=0; //每一包的长度,包括头和两个长度和尾字节
int bufSize=BUF_SIZE;
unsigned char buf[BUF_SIZE]; //read 的缓存
int i=0;
int sfp,nfp; /* 定义两个描述符 */
struct sockaddr_in s_add,c_add;
int sin_size;
unsigned short portnum=6000; /* 服务端使用端口 */
printf("Hello,welcome to my server !\\r\\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfp)
{
printf("socket fail ! \\r\\n");
return -1;
}
printf("socket ok !\\r\\n");
/* 填充服务器端口地址信息,以便下面使用此地址和端口监听 */
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY); /* 这里地址使用全0,即所有 */
s_add.sin_port=htons(portnum);
/* 使用bind进行绑定端口 */
if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{
printf("bind fail !\\r\\n");
return -1;
}
printf("bind ok !\\r\\n");
/* 开始监听相应的端口 */
if(-1 == listen(sfp,5))
{
printf("listen fail !\\r\\n");
return -1;
}
printf("listen ok\\r\\n");
// while(1)
{
// char buf[1027];
// int readlen;
sin_size = sizeof(struct sockaddr_in);
/* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处,
不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。
此处accept的第二个参数用于获取客户端的端口和地址信息。
*/
nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
if(-1 == nfp)
{
printf("accept fail !\\r\\n");
return -1;
}
printf("accept ok!\\r\\nServer start get connect from %#x : %#x\\r\\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
/* 这里使用write向客户端发送信息,也可以尝试使用其他函数实现 */
if(-1 == write(nfp,"hello,welcome to my server \\r\\n",32))
{
printf("write fail!\\r\\n");
return -1;
}
//头0xF9 两个长度字节 数据 尾0xF8
while(1)
{
#ifdef TCP_PACK_DEBUG
{
printf("bufSize = %d ,nBufuseLen = %d\\n",bufSize,nBufuseLen);
}
#endif
if(bufSize>nBufuseLen)
{
nRevOnceLen=read(nfp,buf+nBufuseLen,bufSize-nBufuseLen);
nBufuseLen=nBufuseLen+nRevOnceLen;
#ifdef TCP_PACK_DEBUG
{
printf("nBufuseLen = %d>3\\n",nBufuseLen);
}
#endif
/*
printf(" nRevOnceLen data:\\n");
for(i=0; i<nRevOnceLen; i++)
{
printf(" 0x%x ",buf[i]&0xFF);
}
printf(" \\n");
*/
}
else
{
printf("buf if full\\n");
}
while(nBufuseLen>3) //用到的大于3个字节
{
/* printf(" nBufuseLen data:\\n");
for(i=0; i<nBufuseLen; i++)
{
printf(" 0x%x ",buf[i]&0xFF);
}
printf(" \\n");
*/
#ifdef TCP_PACK_DEBUG
{
printf("buf[0] = 0x%x \\n",buf[0]&0xFF);
}
#endif
if((buf[0]&0xFF)==0xF9) //头
{
nPackLen=(buf[1]*256)+buf[2];
#ifdef TCP_PACK_DEBUG
{
printf("nBufuseLen=%d ,nPackLen=%d\\n",nBufuseLen,nPackLen);
}
#endif
if(nBufuseLen>=nPackLen) //大于和=
{
#ifdef TCP_PACK_DEBUG
{
printf("buf[nPackLen-1] = 0x%x \\n",buf[nPackLen-1]&0xFF);
}
#endif
if((buf[nPackLen-1]&0xFF)==0xF8) //尾
{
//找到一包数据,所有的数据都往前移动nPackLen个字节
#ifdef TCP_PACK_DEBUG
{
printf("head 0x%x length %d tail 0x%x \\n", buf[0]&0xFF,nPackLen,buf[nPackLen-1]&0xFF);
}
#endif
for(i=0; i<nBufuseLen-nPackLen; i++)
{
buf[i]=buf[nPackLen+i];
}
nBufuseLen=nBufuseLen-nPackLen; //用到的字节变小了
// continue; //不要read了
}
else
{
#ifdef TCP_PACK_DEBUG
printf("buf[%d-1]=0x%x,(buf[0]!=0xF8)\\n",nPackLen,(buf[nPackLen-1]!=0xF8)); //这里应该不会执行
for(i=0; i<5; i++)
{
printf(" 0x%x ",buf[i]&0xFF);
}
printf(" \\n");
#endif
printf(" (buf[nPackLen-1]&0xFF)!=0xF8 \\n");
nBufuseLen=0; //清除错误的包 //这里应该不会执行
break;
}
}
else
{
#ifdef TCP_PACK_DEBUG
printf(" nBufuseLen<=nPackLen\\n");
#endif
break;
}
}
else
{
printf(" (buf[0]!=0xF9)\\n"); //这里应该不会执行
nBufuseLen=0; //清除错误的包 //这里应该不会执行
break;
}
}
/*
if((0xFF&buf[0])!=0xF2)
{
printf("readlen = %d buf 0x%x 0x%x 0x%x \\n",readlen,0xFF&buf[0],0xFF&buf[1],0xFF&buf[2]);
}
if(readlen!=1027)
printf("readlen = %d buf 0x%x 0x%x 0x%x \\n",readlen,0xFF&buf[0],0xFF&buf[1],0xFF&buf[2]);
*/
}
// close(nfp);
}
// close(sfp);
return 0;
}
相关推荐
Java实现串口粘包拆包
Java根据协议进行拆包解决串口粘包 串口通信原理 1.串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。 2.串口是计算机上一种非常通用的设备通信协议(不要与通用串行总线Universal SerialBus或者USB混淆) 3.典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)...
Socket 中级篇(四) TCP组包、粘包、拆包的原理
第一章、简介 1、这篇博客我想阐述什么? 在利用Socket+Tcp通信中,如果不采用开源库(比如SuperSocket)来实现,那么就是自己写了。既然自己写的东西,必须考虑稳定性、有效性、可行性等等。 直到今天,在用Socket/TCP做视频监控过程中,当网络较慢时,Socket/tcp通信,并不能一次性地把发送缓存区的数据发送出去。如果接受端不做处理,而是按接...
C++网络通信之TCP数据包发送与接收
1.数据包设计 a.登陆命令 //命令枚举 enum SOCK_CMD { SC_LOGIN,//登陆 SC_LOGOUT,//注销 SC_LOGIN_RET,//登陆结果 SC_LOGOUT_RET,//注销结果 SC_ERR //错误命令 }; b.数据包格式结构 //网络数据头 struct SOCK_DATA_HEAD { short LEN;//数据长度 short SOCK_CMD;//数据对应命令 }; c.登陆结构体 //登陆结构体 struct LOGIN
详解一次完整的数据包传输过程 -- 层层递进
文章目录 例子 PC1 发送http请求到ServerStep1: PC1封装数据包Step 2: 数据到达集线器Step3: 数据到达R1Step4: 数据到达R2Step5: 交换机处理Step6: 服务器处理反向传输总结 题记:本文主要是摘自CCNA指南中讲的,再加上自己的理解,详细阐述一次完整的数据传输过程。之前在考CCIE的时候也看过,后来有些忘记,特总结记录。 读此文章之前,先弄懂下面5个基本知识点: 封装报文是从上层到下层(应用层 --> 传输层 --> ..
学习笔记9--智能驾驶的功能安全设计之功能安全设计
本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》。此专栏是关于《自动驾驶系统设计及应用》书籍的笔记.
Window10 intel realsense D435安装并实现opencv显示realsense读取的彩色和深度数据(QT+openCV+rsD35)
(1)点击"官方指南" 来到下载页,->最新的稳定版本发布 (本人下的2.16.5,现在最新2.17.0) 不需要做开发,只要下载Intel RealSense Viewer就好,这个就是相机的可视化界面,简洁明了。对应的安装包是Intel.RealSense.Viewer.exe。 本人的毕设要用到深度图做开发,所以安装Intel.RealSense.SDK.exe,SDK...
TCP通信分包和组包过程详解
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。在TCP通信中,数据的传输需要进行分包和组包操作,以确保数据的完整性和可靠性。本文将详细介绍TCP通信中的分包和组包过程,结合C语言代码进行说明,并探讨其原因、解决办法以及应用场景。
PTA-浙大版 《Python程序设计》 第三章编程题目及答案
博主第一次写优快云的博客,所以排版上可能有些不尽人意,代码部分均为自己的思路,可能复杂或者考虑欠妥,欢迎大家一起讨论~ 第一题:大于身高的平均值 这里用了np数组求得平均数,当然for循环累加也是可以的 import numpy as np data = input().split() data = list(map(int,data)) avg = np.mean(data) for i in data: if i > avg: print(i,end = '
Netty(二)、TCP粘包/拆包问题的解决之道
为了解决TCP粘包/拆包问题导致的半包读写问题,Netty默认提供了多种解码器用于处理半包,只要熟练掌握这些类库的使用,TCP粘包的问题从此变得非常简单,你甚至不用关心他们,这也是其他NIO框架和原生的NIO API所无法匹敌的。在上一章的时间服务器的案例中,就没有考虑读半包的问题,这在功能测试中没有问题,但压力一旦上来了,或者发送大报文之后,就会存在粘包/拆包问题。改动的地方在于,每次应答都会计数。由于上面的例子没有考虑TCP的粘包/拆包问题,所以当发生TCP粘包的时候,我们的程序就不能正常工作了。
参考线平滑-FemPosDeviation-SQP
使用SQP(顺序二次规划)对离散点进行平滑
告别死记硬背!用业务场景驱动理解SAP PS OPSA参数文件配置
本文通过制造业新产品研发项目案例,详细解析SAP PS模块中OPSA参数文件配置的实际应用。从项目立项、WBS分解到研发物料管理,系统讲解关键配置项的业务价值,帮助用户告别死记硬背,实现业务场景驱动的参数配置学习。特别适合制造业项目管理人员提升SAP PS配置效率。
【计网笔记】一起重温计网咯 | TCP协议的粘包/拆包问题
一起重温计网咯 | TCP协议的粘包/拆包问题 前提概要 IP分片和TCP分端(MTU,MSS) 我们知道tcp是以流动的方式传输数据,传输的最小单位为一个报文段(segment)。tcp Header中有个Options标识位,常见的标识为mss(Maximum Segment Size最大消息长度)指的是,连接层每次传输的数据有个最大限制MTU(Maximum Transmissio...
BUSCO评估基因组的完整性
因为数据库收集的时候找的就是在不同的物种间都是单拷贝的基因,所以说在评估的物种里面应该也是单拷贝的状态才对。基因组层面评估:先去基因组上预测这些基因,再去做评估,如果说给他是一个注释好的基因集,这个时候提供的是一个蛋白集合,它就直接是去进行同源搜索,再去评估,看BUSCO数据库里面的这些单拷贝基因有或者无;首先,tblastn也是同源搜索,同源搜索之后,去对转录本进行读码框预测,预测完的结果还是去进行hmmsearch的搜索(hmmsearch是做蛋白质结构域搜索的),最终拿到BUSCO评估结果。
关于TCP 和 Netty 拆包 粘包
一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP 拆包和粘包问题
WandB本地部署踩坑指南:从Docker启动到License更新的完整流程(附常见错误解决方案)
本文详细介绍了Weights & Biases(WandB)机器学习实验管理平台的本地化部署全流程,涵盖从Docker环境搭建、许可证管理到常见错误排查的实战经验。针对企业级应用场景,文章还提供了性能优化、高可用架构设计及开源替代方案Trackio的评估与迁移策略,为构建安全、可控的内部实验追踪平台提供完整解决方案。
想使用dify实现docx文档的自动生成?试了一圈,感觉还是根据python-docx更靠谱
在软件开发过程中,需求文档、设计文档等材料的编写是每个开发者都绕不开的工作。最近笔者接到一个需要批量生成标准化需求文档的任务,尝试了目前热门的低代码工具Dify后,发现对于稍微复杂格式的文档生成需求(例如文本居中这么简单的需求),最终还是回归到基于python-docx库的解决方案。本文将分享两种技术路线的对比实践。
Java随笔记 - 断包和粘包 解决方法
Java随笔记 -断包和粘包 解决方法 断包和粘包 断包和粘包是Socket编程中经常提及的一个问题,这里大致从概念角度进行讲解,后续博客应该会结合代码实例进行简单的实验对比。TCP协议是面向连接、面向流的,因此它并不知道它在传输的是什么具体内容。而且当我们在同一条连接上传输多笔数据的时候,TCP协议会根据数据包的大小,出于性能以及包大小限制的考虑,对数据包进行合并或者切分发送。也就是说,我们自定义的应用数据包,如果比较小,那么在同一个TCP数据包中就可能含有多个上述自定义的数据包;而如果我们的自定义数
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
浅谈一下 TCP 拆包粘包问题(1)
作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java经典面试问题(含答案解析).pdf和一份网上搜集的“Java程序员面试笔试真题库.pdf。
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
TCP协议中的核心知识点,SYN Flood?ISN?滑动窗口?数据重传?拆包粘包?单tcp连接多请求?拥塞管理?(个人收藏学习笔记)
TCP协议中的核心知识点,滑动窗口?数据重传?拆包粘包?单tcp连接多请求?1.前言2.TCP/IP四层结构3. TCP3.1 TCP 协议头3.2 TCP通信过程3.2.1 建立连接的三次握手阶段3.2.1.1 关于建连接时SYN超时3.2.1.2 关于SYN Flood攻击3.2.2 断开连接的四次挥手阶段3.2.3 数据传输过程`(涉及到我们本篇标题的知识点)参考资料 1.前言 上周和同事...
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
Netty学习笔记之七:Netty关于TCP拆包和粘包的解决方案
1. Netty学习笔记之七:Netty关于TCP拆包和粘包的解决方案 文章目录1. Netty学习笔记之七:Netty关于TCP拆包和粘包的解决方案1.1. Netty编程核心之网络传输TCP粘包拆包1.1.1. 什么是TCP粘包,什么是TCP拆包1.1.2. 常见的粘包拆包解决方案1.1.3. Netty自带解决半包读写的方案1.1.4. 半包读写问题演示1.2. Netty案例之解决TCP半...
netty学习笔记14 - TCP粘包和拆包
TCP粘包与拆包基本介绍 TCP是面向连接的,面向流的,提供高可靠 性服务。收发两端 (客户端 和服务端)都要有一一对比的socket,因此,发送端为了就多个发给服务端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合成 一个大的数据块,然后进行封包。这样做虽然高效,但接收端就难与分辨出完整的数据包了,因为面向流的通信是无消息保护边界的 由于TCP无消息...
Netty 是如何解决 TCP 粘包拆包的?
点击关注公众号,Java干货及时送达作者:rickiyang出处:www.cnblogs.com/rickiyang/p/11074235.html我们都知道TCP是基于字节流的传输协议。...
TCP-缓冲区和粘包、拆包有什么关系?
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,领取丰富面试资料和学习资料。 你了解TCP缓冲区吗?它和TCP传输中的粘包和拆包有什么关系呢?粘包和拆包分别发生在TCP的那个阶段呢? 先简单回顾下TCP概念:在网络传输中TCP是面向连接的、可靠的、双通道、字节流一对一传输。TCP双方通信必须要先建立连接,然后分配必要的内核资源。双方交换完毕数据之后必须都要断开连接用来释放系统资源,长链接可以不必断开连接复用同一个通道。那么什么是TCP的缓冲区呢? 操作系统中有两个空间:用户
Netty 学习笔记(六)、Netty 如何解决 TCP 粘包/拆包问题
概述 在早先博客我通过 NIO 实现时间服务器时曾提到:TCP 可能造成粘包/拆包问题,但由于之前的示例相对简单,因此没有做预防处理。本篇博客我就来简单聊一下 TCP 粘包/拆包 问题以及 Netty 如何解决该问题。 什么是 TCP 粘包/拆包问题 TCP 是一种流传输协议,所谓流传输就是指数据包之间没有界限,所有数据都是连在一起的。顶层应用层通过 TCP 发送数据时,TCP 并不了解该数据具体含义,它只会根据当前缓冲区的实际情况进行数据包的划分。这样就可能导致一个完整的业务数据包被拆分为多个TCP包发
Netty 笔记之粘包拆包问题
在 TCP 的通信过程中,发送数据流的时候,有可能出现一份完整的数据,被 TCP 拆分为多个数据包进行发送,当然也有可能将多个数据包合并为一个数据包进行发送。从而产生了粘包以及拆包的问题。
TCP粘包和拆包
将一个完成的数据包拆分成多个数据包发送。
4375



被折叠的 条评论
为什么被折叠?



