当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粘包处理讲解示例相关推荐

  1. 自定义封包协议c语言,Socket分包,封包,粘包

    一.简单了解TCP 二.为什么要分包? 这里的分包我表示的是两层意思,第一层意思:比如我们定义每一次发送的数据大小为8k(因为在真正的项目编程中基本都是要进行封装的,所以发送的大小基本固定),那如果我 ...

  2. qt 串口粘包_Qt Socket 传输图片——图像拆包、组包、粘包处理

    之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...

  3. python socket send_python socket 连续send,出现粘包问题

    使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回 import socket import os #声明类型,生成socket链接对象 se ...

  4. python socket 连续send,出现粘包问题

    使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server ...

  5. Socket封包、拆包、粘包

    接触Socket通信的过程中,遇到了各种有关数据包的问题.这里做一下记录. 一.Socket粘包 1.什么是粘包? 答:顾名思义,其实就是多个独立的数据包连到一块儿. 2.什么情况下需要考虑粘包? 答 ...

  6. 什么是粘包?socket 中造成粘包的原因是什么? 粘包的处理方式

    1.粘包的概念 粘包:多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使指发送方发送的若干包数据到 ...

  7. C语言Socket之iOS项目中的socket应用/IPV6 转换/域名转IP/解析socket接受的数据/心跳包

    使用系统API合成IPv6: 如果你的APP需要连接的服务器 只有IPv4地址,没有域名,可以用 getaddrinfo 来解决.下面的代码,将IPv4地址(如:192.0.2.1) 地址转换为IPv ...

  8. websocket底层处理粘包_Socket解决粘包问题1

    粘包是指发送端发送的包速度过快,到接收端那边多包并成一个包的现象,比如发送端连续10次发送1个字符'a',因为发送的速度很快,接收端可能一次就收到了10个字符'aaaaaaaaaa',这就是接收端的粘 ...

  9. java的socket包_Java socket详解(转)

    在实际应用中,socket发送的数据并不是按照一行一行发送的,比如我们常见的报文,那么我们就不能要求每发送一次数据,都在增加一个"\n"标识,这是及其不专业的,在实际应用中,通过是 ...

  10. TCP粘包为什么会粘包? 背后的原因让人暖心

    事情从一个健身教练说起吧. 李东,自称亚健康终结者,尝试使用互联网+的模式拓展自己的业务.在某款新开发的聊天软件琛琛上发布广告. 键盘说来就来.疯狂发送"李东",回车发送!,&qu ...

最新文章

  1. Winform中设置BackgroundWorker在取消时关闭后台进程不生效-没有跳出循环
  2. 解决Dependency ‘xxxx‘ not found
  3. freemarker迭代list、map等常规操作
  4. Struts2内置拦截器和自定义拦截器
  5. python在函数外调用变量
  6. Spring中如Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?
  7. SAP中Search help的使用
  8. 如何用最简单的方法将PCweb改成适合各种设备的web
  9. 计算机接口技术试题,广西工学院计算机接口技术考核试题(4套,有答案)
  10. 服务器部署Nodejs api 接口
  11. Android仿华为watch睡眠,华为watch2pro怎么查看睡眠状态
  12. 对接饿了么 获取授权
  13. 生信过程中的各种文件格式
  14. python给excel排序_数据处理,Excel的排序功能,使用pandas在Python中轻松完成
  15. c语言程序设计杨明莉刘磊答案,清华大学出版社-图书详情-《C/C++程序设计基础与实践教程(第2版)》...
  16. 用ros3.3中的nth进行带宽叠加
  17. mpvue小程序实现人脸识别/视频录制/身份验证/CryptoJS加密 等功能
  18. 网络爬虫学习软件篇-Python(一)下载安装(超详细教程,傻瓜式说明)
  19. sqlplus 为什么会自动断开_为什么设置的手机铃声会自动变为手机默认的,原因在这里...
  20. 面向对象分割:结合eCognition与python

热门文章

  1. R语言WVPlots包可视化克利夫兰点ClevelandDotPlot、并按照分类变量排序进行可视化克利夫兰点ClevelandDotPlot
  2. pandas改变dataframe的列的顺序、改变数据列的排列次序
  3. 什么是标签传播算法?为什么要使用标签传播算法?如何使用?
  4. 多分类学习方法、One vs. Rest、One vs. One、Many vs. Many、多输出分类
  5. insert size|single-read|Paired-end|Mate-pair
  6. Git的使用---版本控制
  7. Python操作SQLite3
  8. Failed to load module canberra-gtk-module错误的解决方案
  9. 操作系统 进程调度-银行家算法实验报告
  10. 目标检测--Feature Pyramid Networks for Object Detection