文档章节

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

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

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
博文 7
码字总数 6797
作品 0
杭州
程序员
Netty精粹之TCP粘包拆包问题

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

Float_Luuu
2016/02/27
8.6K
0
Netty 粘包/拆包应用案例及解决方案分析

熟悉TCP变成的可以知道,无论是客户端还是服务端,但我们读取或者发送消息的时候,都需要考虑TCP底层粘包/拆包机制,下面我们先看一下TCP 粘包/拆包和基础知识,然后模拟一个没有考虑TCP粘包...

Java/Python
08/21
0
0
TCP 粘包问题浅析及其解决方案

最近一直在做中间件相关的东西,所以接触到的各种协议比较多,总的来说有TCP,UDP,HTTP等各种网络传输协议,因此楼主想先从协议最基本的TCP粘包问题搞起,把计算机网络这部分基础夯实一下。...

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

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

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

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

山东-小木
2014/12/18
0
4

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部