linux第6天 流协议-粘包
今天学习的主要是对第5天的加强.
比如服务器的多进程,点对点应用聊天程序.父进程子进程互发消息.等等.
流协议-粘包
一般TCP协议会出现粘包,粘包产生的原因一般为.TCP协议是流式传输,不会根据用户传输数据的大小进行截断,
所以用户数据的传输很可能被TCP截断,所以就有了一种对数据包的再包装.
思想是.在该数据包的包头再放上4个字节的数,用于存放该数据包数据的大小,
值得注意的是.这4个字节需要转换成网络字节序,在接受端,也需要转成本地字节序,
互联网的数据传输可能会遇上各种各样客观的问题,比如,被信号打断,socket的关闭等等,都将引起数据传输异常,
对异常的处理常常很考验程序员的功力,
read函数,返回-1,代表读取失败,可能是读到文件末尾,无可读取的数据
当read的对面关闭时,TCP协议会发送一个FIN指令,read会返回0,
如果被一个信号中断,也返回-1,但errno的值被设定为EINTR
附上一个函数.
ssize_t readn(int fd, void *buf, size_t count)
{
size_t nRead = 0; //表示本次已读取字符数
size_t lRead = count; //表示还剩余字节数
char *pbuf = (char *)buf; //表示要读取字符串的文件指针 while (lRead > 0)
{
nRead = read(fd, pbuf, lRead);
if (nRead < 0)
{
if (errno == EINTR)
continue;
else
return -1;
}
else if (0 == nRead)
{
return (count - lRead); //被对方关闭,返回已读到的字节数
} pbuf += nRead;
lRead = lRead - nRead;
}
return count;
}
linux第6天 流协议-粘包的更多相关文章
- python 全栈开发,Day35(TCP协议 粘包现象 和解决方案)
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
- TCP协议粘包问题详解
TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...
- Linux 网络编程详解五(TCP/IP协议粘包解决方案二)
ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...
- 基于udp协议的套接字及udp协议粘包问题
udp协议的套接字 udp协议传输 服务端和客户端没有建立连接一说. import socket # 总结一下基础工作流程:服务端生成套接字并绑定ip_port,进入数据传输循环,服务端接受客户端发 ...
- 从零开始实现简单 RPC 框架 7:网络通信之自定义协议(粘包拆包、编解码)
当 RPC 框架使用 Netty 通信时,实际上是将数据转化成 ByteBuf 的方式进行传输. 那如何转化呢?可不可以把 请求参数 或者 响应结果 直接无脑序列化成 byte 数组发出去? 答:直接 ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- Linux 网络编程详解四(流协议与粘包)
TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...
- scoket模块 粘包问题 tcp协议特点 重启服务器会遇到地址被占用问题
scoket()模块函数用法 import socket socket.socket(socket_family,socket_type,protocal=0) 获取tcp/ip套接字 tcpsock ...
- 为什么 TCP 协议有粘包问题
为什么 TCP 协议有粘包问题 这部分转载自draveness博客. TCP/IP 协议簇建立了互联网中通信协议的概念模型,该协议簇中的两个主要协议就是 TCP 和 IP 协议.TCP/ IP 协议簇 ...
随机推荐
- extjs MVC模式的个人看法
针对一个后台管理页面是mvc模式,后台也是mvc模式下的项目,要怎么去熟悉呢? 首先以我个人的认解,先从后台的管理界面来看,会有control,model,store,view:其中先看view的代码 ...
- nrf51822裸机教程-PPI
Programmable Peripheral Interconnect即可编程外设互联 系统,该模块是51822 提供的一个特性. 目的是为了让51822 的外围模块可以不通过处理器而自动相互作用. ...
- iOS 键盘隐藏
IOS7 点击空白处隐藏键盘的几种方法 IOS开发中经常要用到输入框,默认情况下点击输入框就会弹出键盘,但是必须要实现输入框return的委托方法才能取消键盘的显示,对于用户体验来说很不友好,我 ...
- php--tp3.2引入sphinx搜索
1.首先我们把coreseek下载好,命名为coreseek,我们找到coreseek/etc中的csft_mysql.conf修改这个配置文件 #源定义 source lemai { type ...
- JS的基础类型与引用类型
两种类型: ECMAScript变量包含两种不同类型的值:基本类型值.引用类型值: 基本类型值:指的是保存在栈内存中的简单数据段: 引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际 ...
- Java学习-024-获取当前类名或方法名二三文
今天,看朋友编写程序,打印日志时,需要记录当前类的类名以及当前方法的方法名,我发现 TA 将类名或者方法名直接写死在了代码中...虽说这样可以实现记录类名和方法名,但是当有特殊情况需要修改类名或者方法 ...
- Java final,static 关键字
final关键字: 这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的.final方法不能被子类 ...
- WPF 程序检测 windows 关机
1.使用SessionEnding事件 参考MSDN. 2.在需要处理 关机事件中可以注册SessionEnding事件 App.Current.SessionEnding += Current_Se ...
- Python之路-python环境安装和简单的语法使用
一.环境安装 Win10(安装python3.x): 1.下载安装包 https://www.python.org/downloads/ 2.安装完成后设置环境变量. 桌面-“计算机”-右 ...
- python 之 append extend
概述 append和extend针对python的列表 列表内的元素为对象,可以为数字.字符串.列表等等 append添加的是一个对象 extend添加一个列表 例子 append >>& ...