c# socket 客户端 循环发包 服务器端粘粘包严重!求高手给我个解决粘包的例子!

c# socket 客户端 循环发包 服务器端粘粘包严重!求高手给我个解决粘包的例子!,第1张

粘包是因为发送太快了,可以通过发送固定长度数据包和在数据包前后加标识以做截取解决。

给你介绍第一种方法,发送固定长度的数据包,不足长度的补数,这种方法要固定读取N长度的数据

整体说按类型分,可以分为头包,一般包,尾包

这三种数据包的格式可以这样包头+实际数据+检验位

1 头包,比如可以是A01:LXXXXXXXXXXXC

包头可以用包头标识+第几帧+开始截取标志+文件长度L构成,例子中是A01:),L为所有数据包加起来的实际数据总长度,XXXXXXXX为实际数据占 N字节(N为固定字节,这个你自己定义大小),C为校验位占一个字节,即所有数据的累加和

2 一般包,格式可以为P02:XXXXXXXXXXXXC

类似包头格式,P为一般包标识,02表示第二个包

3 包尾,格式可以为D03:XXXXXFFFFFFC

此处XXXXX为实际数据,FFFFF为不足N位的补数,最后一个包是多长可以通过头包L跟尾包算出来

各种校验

1 收到的数据包要做校验位验证,就是格式中的C

2 每次收到包要判断是不是期望的包,通过第几个包来判断,比如你要收第4个包了,但你收到了P05,那就重新请求一次要收第四个包,或者是直接失败

3 其他校验,具体情况具体分析

第二种数据包前后加标识以做截取解决也是类似的,就是在实际数据前后加上一些供你判断的标识,思路已经在这里了,具体格式要自己定义,因为你是程序员

事件背景  ubuntu 系统

        IP下链接服务器,客户端访问 服务器 出现问题 

路由器端口映射 将服务器通过IP 映射至公网 网络检查  需验证 UDP 协议的端口是否 可以通过公网链接至服务器进行发包

准备  两台服务器   一台服务器在 此IP下进行端口映射 使用UDP协议映射至公网    一台服务器不在此IP下且不在同网段下 

需要实现  两台服务器 之间 通过UDP 链接进行发包  

两台服务器 安装 NC 工具     sudo apt-get install netcat-traditional -y    安装后  默认开启此工具

需验证的IP下服务器   通过 命令   nc -lu ip port  本地IP 需要验证的端口  

配合测试服务器  安装后   使用 nc -u ip port 公网IP 需要验证的端口

IP下的服务器
配合测试服务器
连接实现 后两服务器 可以实现互相发送 字符  验证结果 此IP下的端口50000  可以实现连接

而同期的TCP 则简单很多  直接通过自己的电脑   telnet IP 端口   端口连接接通后 会跳转 一个窗口 代表连接接通

否则 为不同

rz中的r意为received(接收),输入rz时、意为服务器接收文件,既将文件从本地上传到服务器。
sz中的s意为send(发送),输入sz时、意为服务器要发送文件,既从服务器发送文件到本地,或是说本地从服务器上下载文件。
注:不论是send还是received,动作都是在服务器上发起的。
上传文件只需在shell终端仿真器中输入命令"rz",即可从d出的对话框中选择本地磁盘上的文件,利用Zmodem上传到服务器当前路径下。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10351584.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-07
下一篇 2023-05-07

发表评论

登录后才能评论

评论列表(0条)

保存