c 语言socket粘包,C# Socket粘包处理讲解示例
当socket接收到数据后,会根据buffer的大小一点一点的接收数据,比如:
对方发来了1M的数据量过来,但是,本地的buffer只有1024字节,那就代表socket需要重复很多次才能真正收完这逻辑上的一整个消息。
对方发来了5条2个字符的消息,本地的buffer(大小1024字节)会将这5条消息全部收入囊下...
那么,如何处理呢?下面我以最简单的一种文本消息来demo
根据上面所描述的情况,最重要的关键落在了下面3个因素的处理上
消息的结尾标记
接收消息时判断结尾标记
当本次buffer中没有结尾标记时怎么处理
我把写好的核心算法贴出来:
复制代码 代码如下:
StringBuilder sb = new StringBuilder(); //这个是用来保存:接收到了的,但是还没有结束的消息
public void ReceiveMessage(object state) //这个函数会被以线程方式运行
{
Socket socket = (Socket)state;
while(true)
{
byte[] buffer = new byte[receiveBufferSize]; //buffer大小,此处为1024
int receivedSize=socket.Receive(buffer);
string rawMsg=System.Text.Encoding.Default.GetString(buffer, 0, receivedSize);
int rnFixLength = terminateString.Length; //这个是指消息结束符的长度,此处为\r\n
for(int i=0;i
{
if (i <= rawMsg.Length - rnFixLength)
{
if (rawMsg.Substring(i, rnFixLength) != terminateString)//非消息结束符,则加入sb
{
sb.Append(rawMsg[i]);
i++;
}
else
{
this.OnNewMessageReceived(sb.ToString());//找到了消息结束符,触发消息接收完成事件
sb.Clear();
i += rnFixLength;
}
}
else
{
sb.Append(rawMsg[i]);
i++;
}
}
}
}
这个组件的使用方法:
复制代码 代码如下:
A2DTcpClient client = new A2DTcpClient("127.0.0.1", 5000);
client.NewMessageReceived += new MessageReceived(client_NewMessageReceived);
client.Connect();
client.Send("HELLO");
client.Close();
static void client_NewMessageReceived(string msg)
{
Console.WriteLine(msg);
}
时间: 2013-12-03
c 语言socket粘包,C# Socket粘包处理讲解示例相关推荐
- 自定义封包协议c语言,Socket分包,封包,粘包
一.简单了解TCP 二.为什么要分包? 这里的分包我表示的是两层意思,第一层意思:比如我们定义每一次发送的数据大小为8k(因为在真正的项目编程中基本都是要进行封装的,所以发送的大小基本固定),那如果我 ...
- qt 串口粘包_Qt Socket 传输图片——图像拆包、组包、粘包处理
之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...
- python socket send_python socket 连续send,出现粘包问题
使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回 import socket import os #声明类型,生成socket链接对象 se ...
- python socket 连续send,出现粘包问题
使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server ...
- Socket封包、拆包、粘包
接触Socket通信的过程中,遇到了各种有关数据包的问题.这里做一下记录. 一.Socket粘包 1.什么是粘包? 答:顾名思义,其实就是多个独立的数据包连到一块儿. 2.什么情况下需要考虑粘包? 答 ...
- 什么是粘包?socket 中造成粘包的原因是什么? 粘包的处理方式
1.粘包的概念 粘包:多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使指发送方发送的若干包数据到 ...
- C语言Socket之iOS项目中的socket应用/IPV6 转换/域名转IP/解析socket接受的数据/心跳包
使用系统API合成IPv6: 如果你的APP需要连接的服务器 只有IPv4地址,没有域名,可以用 getaddrinfo 来解决.下面的代码,将IPv4地址(如:192.0.2.1) 地址转换为IPv ...
- websocket底层处理粘包_Socket解决粘包问题1
粘包是指发送端发送的包速度过快,到接收端那边多包并成一个包的现象,比如发送端连续10次发送1个字符'a',因为发送的速度很快,接收端可能一次就收到了10个字符'aaaaaaaaaa',这就是接收端的粘 ...
- java的socket包_Java socket详解(转)
在实际应用中,socket发送的数据并不是按照一行一行发送的,比如我们常见的报文,那么我们就不能要求每发送一次数据,都在增加一个"\n"标识,这是及其不专业的,在实际应用中,通过是 ...
- TCP粘包为什么会粘包? 背后的原因让人暖心
事情从一个健身教练说起吧. 李东,自称亚健康终结者,尝试使用互联网+的模式拓展自己的业务.在某款新开发的聊天软件琛琛上发布广告. 键盘说来就来.疯狂发送"李东",回车发送!,&qu ...
最新文章
- Winform中设置BackgroundWorker在取消时关闭后台进程不生效-没有跳出循环
- 解决Dependency ‘xxxx‘ not found
- freemarker迭代list、map等常规操作
- Struts2内置拦截器和自定义拦截器
- python在函数外调用变量
- Spring中如Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?
- SAP中Search help的使用
- 如何用最简单的方法将PCweb改成适合各种设备的web
- 计算机接口技术试题,广西工学院计算机接口技术考核试题(4套,有答案)
- 服务器部署Nodejs api 接口
- Android仿华为watch睡眠,华为watch2pro怎么查看睡眠状态
- 对接饿了么 获取授权
- 生信过程中的各种文件格式
- python给excel排序_数据处理,Excel的排序功能,使用pandas在Python中轻松完成
- c语言程序设计杨明莉刘磊答案,清华大学出版社-图书详情-《C/C++程序设计基础与实践教程(第2版)》...
- 用ros3.3中的nth进行带宽叠加
- mpvue小程序实现人脸识别/视频录制/身份验证/CryptoJS加密 等功能
- 网络爬虫学习软件篇-Python(一)下载安装(超详细教程,傻瓜式说明)
- sqlplus 为什么会自动断开_为什么设置的手机铃声会自动变为手机默认的,原因在这里...
- 面向对象分割:结合eCognition与python
热门文章
- R语言WVPlots包可视化克利夫兰点ClevelandDotPlot、并按照分类变量排序进行可视化克利夫兰点ClevelandDotPlot
- pandas改变dataframe的列的顺序、改变数据列的排列次序
- 什么是标签传播算法?为什么要使用标签传播算法?如何使用?
- 多分类学习方法、One vs. Rest、One vs. One、Many vs. Many、多输出分类
- insert size|single-read|Paired-end|Mate-pair
- Git的使用---版本控制
- Python操作SQLite3
- Failed to load module canberra-gtk-module错误的解决方案
- 操作系统 进程调度-银行家算法实验报告
- 目标检测--Feature Pyramid Networks for Object Detection