文档章节

TCP粘包/拆包问题处理手段

钟路强
 钟路强
发布于 2016/09/10 18:52
字数 323
阅读 82
收藏 1
点赞 0
评论 0

TCP以流的方式处理数据,数据发送和接收过程中可能出现拆包或粘包现象,即一次发送的数据分两次接收,或两次发送的数据被一次接收。这在以某种约定协议进行通信的程序设计过程中需要慎重考虑,如果发生粘包或拆包,将使得一次接收的数据报文不完整,所以一般需要将报文设计成定长,或是加入长度字段,按指定的长度来接收数据。按下面这个函数来设计接收程序,可以保证一次读取到所有希望读取的字节数。

/*读取固定字节的数据,数据不够或读取出错时返回-1,成功则返回读取的字节数*/
int read_n(int fd, void *buffer, int count)
{
	int ret;
	int nread, nleft;
	unsigned char *ptr;
	fd_set rset;
	
	ptr = buffer;
	nleft = count;
	while(nleft > 0)
	{
		FD_ZERO(&rset);
		FD_SET(fd, &rset);
		ret = select(fd + 1, &rset, NULL, NULL, NULL);
		if(ret < 0)
		{
			printf("select error\n");
			return -1;
		}
		else
		{
			nread = recv(fd, ptr, nleft, 0);
			if(nread < 0)
			{
				if(errno == EINTR)
				{
					nread = 0;
					printf("EINTR happen when select\n");
				}
				else
				{
					printf("recv error\n");
					return -1;
				}
			}
			else if(nread == 0)
			{
				if((count - nleft) != 0)
				{
					printf("connection closed\n");
					break;
				}
				else
				{
					printf("connection closed errno = %d\n", errno);
					return -1;
				}
			}
			nleft -= nread;
			ptr += nread;
		}
	}
	return count - nleft;
}

© 著作权归作者所有

共有 人打赏支持
钟路强
粉丝 1
博文 3
码字总数 6797
作品 0
杭州
程序员
Netty精粹之TCP粘包拆包问题

粘包拆包问题是处于网络比较底层的问题,在数据链路层、网络层以及传输层都有可能发生。我们日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生这个问题,因此这篇文章只...

Float_Luuu ⋅ 2016/02/27 ⋅ 0

Netty解决半包(TCP粘包/拆包导致)读写问题

TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限没有分割的一串数据。TCP会根据缓冲区的实际情况进行包划分,一个完整的包可能会拆分成多个包进行发送,也用可能把多个小包封装成一个大...

天冰 ⋅ 2014/06/19 ⋅ 0

Netty5入门学习笔记003-TCP粘包/拆包问题的解决之道(下)

TCP网络通信时候会发生粘包/拆包的问题,上节使用定长解码器解码,本次使用Netty提供的特殊分隔符解码器 还是用上节中的代码例子,但是只需要修改一下发送的消息和配置一下解码器就可以了 客...

山东小木 ⋅ 2014/12/18 ⋅ 4

tcp协议数据传输“粘包”分析

这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下: 一 .两个简单概念长连接与短连接: 1.长连接 Client方与Server方先建立通讯连接...

长平狐 ⋅ 2013/12/25 ⋅ 0

关于tcp协议可靠性的个人理解

1、首先,因为tcp协议是可靠的,所以不存在丢包问题,也不存在包顺序错乱问题(udp会存在这个问题,这个时候需要自己使用序号之类的机制保证了,这里只讨论tcp)。 2、tcp传输会有粘包的问题...

libaineu2004 ⋅ 2017/12/13 ⋅ 0

TCP粘包, UDP丢包, nagle算法

一、TCP粘包 1. 什么时候考虑粘包 如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题(因为只有一种包结构,类似于http协议,UDP不会...

Playboy002 ⋅ 2015/09/14 ⋅ 0

Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)

TCP网络通信时候会发生粘包/拆包的问题,接下来探讨其解决之道。 什么是粘包/拆包 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘包呢?主要原因是...

山东小木 ⋅ 2014/12/17 ⋅ 11

Dubbo处理TCP拆包粘包问题

Dubbo处理TCP拆包粘包问题 在TCP网络传输工程中,由于TCP包的缓存大小限制,每次请求数据有可能不在一个TCP包里面,或者也可能多个请求的数据在一个TCP包里面。那么如果合理的decode接受的T...

Bieber ⋅ 2015/08/03 ⋅ 13

Golang实现简单tcp服务器04 -- 服务器的粘包处理

什么是粘包 一个完成的消息可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题 TCP粘包和拆包产生的原因 应用程序写入数据的字节...

victoriest ⋅ 2015/06/02 ⋅ 0

TCP协议粘包和拆包解析

TCP是一个"流"协议,没有边界的一段数据.像打开自来水管一样,连成一片,没有边界. TCP协议并不了解上层的业务在做什么东西,有什么含义,它会根据自己的缓冲区的实际情况进行数据包的划分. 所以,...

ParkJun ⋅ 2016/03/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 50分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部