IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 网络编程 ------ 连接关闭(closeshutdown) -> 正文阅读

[网络协议]网络编程 ------ 连接关闭(closeshutdown)

close函数和shutdown函数都用于关闭一个四元组标识的连接。接下来简单介绍一下
1)close函数

#include <unistd.h>
int close(int sockfd);
                           返回:成功返回0,出错则返回-1;

close的默认行为是将套接字标记成关闭,然后立即返回,此后不能使用此套接字调用read和write函数,调用close后在内核层面会将套接字发送缓冲区里面的数据全部发送到对端,这部分数据确认后然后执行四次挥手。我们可以通过setsocket()函数设置 SO_LINGER选项,修改参数,来改变close的默认行为。
在并发编程时,由于父子进程共用一个套接字,父进程调用close套接字时只是导致套接字描述符的引用计数减一,当引用计数为0的时候才会终止连接,

struct linger{
   int  l_onoff;
   int  l_linger;
}
  1. 当l_onoff为0时,LINGER选项被关闭,此时执行tcp的默认选项。 在这里插入图片描述

  2. 当l_onoff非0且l_linger为0时,tcp将丢弃保留在套接字发送缓冲区中的任何数据,然后发送一个RST到对端,这样就避免了time_wait状态,如果此时在2MSL内使用相同的四元组建立一个新的连接,旧的数据就会被传送到这个新的连接。

  3. 当l_onoff非0且l_linger非0时,当套接字关闭的时候,如果套接字缓冲区仍然残留有数据,那么进程会被睡眠,直到所有的数据都被对端确认或者睡眠时间到。我们可以通过close的返回值来区分这两种情况,如果返回EWOULDBLOCK错误则代表迟滞时间到,并且此时套接字发送缓冲区的任何残留数据都会被丢弃。在这里插入图片描述

其实SO_LINGER参数控制的实际是close函数在四次挥手阶段不同阶段的返回,对于情况1,则是立即发出FIN后立即返回,所以不能保证数据缓冲区的数据是否正确被对端tcp接收到,情况3则是在收到发出数据和FIN的响应后返回。可以保证数据被对端tcp收到。
2)shutdown函数
关闭一个连接通常使用close,但是close有两个限制,可以使用shutdown来解决。

  1. 使用close的时候会把套接字的引用计数减一,只有计数变为0时才关闭套接字,shutdown可以不用管计数就可以直接关闭套接字
  2. close关闭的是读和写两个方向的传送,当一方完成了数据传送,但是另一方仍然有数据需要传送的时候,需要使用shutdown来达到半关闭的状态,使得对方的数据能够正确到达。
#include <sys/socket.h>
    int shutdown(int sockfd,int howto);
                    返回:若成功则为0,若出错则为-1;

函数的行为依赖于howto参数的值:

  1. SHUT_RD: 关闭连接的读这一半,将读缓冲区里面的所有数据都进行确认(向对端发送ack),然后丢弃这部分数据。
  2. SHUT_WR:关闭连接的写这一半,这成为半关闭,当前留在套接字发送缓冲区的数据将被发送掉,然后正常终止序列,此时不管引用计数是否等于0。
  3. SHUT_RDWR:这与调用两次shutdown函数相等,第一次使用SHUT_RD,第二次使用SHUT_WR。
    我们使用close关闭连接时,设置SO_LINGERCNA参数,close的成功返回只能保证传输层层面的数据确认,并不能保证应用进程也已经读取数据。要确保应用进程读取数据,有两种方法:
    1)shutdown+read,在调用shutdown函数后加一个阻塞的read函数,read函数会在第三次挥手的时候收到对端的FIN后返回,保证应用程序端可以处理完数据
    在这里插入图片描述
    2)应用ACK,在调用closed之前先使用阻塞read函数从对端读取一个字节的数据作为应用ACK,这个字节用全零作为标识。
    在这里插入图片描述
    这两个函数对tcp的影响具体入下图:
    在这里插入图片描述
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:49:22  更:2022-03-03 16:51:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:53:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码