UNIX网络编程——shutdown 与 close 函数 的区别
假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 给server的,write调用只负责把数据交给TCP发送缓冲区就可以成功返回了,所以不会出错,而server收到数据后应答一个RST段,表示服务器已经不能接收数据,连接重置,client收到RST段后无法立刻通知应用层,只把这个状态保存在TCP协议层。如果client再次调用write发数据给server,由于TCP协议层已经处于RST状态了,因此不会将数据发出,而是发一个SIGPIPE信号给应用层,SIGPIPE信号的缺省处理动作是终止程序。
有时候代码中需要连续多次调用write,可能还来不及调用read得知对方已关闭了连接就被SIGPIPE信号终止掉了,这就需要在初始化时调用sigaction处理SIGPIPE信号,对于这个信号的处理我们通常忽略即可,signal(SIGPIPE, SIG_IGN); 如果SIGPIPE信号没有导致进程异常退出,write返回-1并且errno为EPIPE。
#include <unistd.h>int close(int fd);
close 关闭了自身数据传输的两个方向。
close一个TCP套接字的默认行为是把该套接字标记成已关闭,然后立即返回到调用进程。该套接字描述符不能再由调用进程使用,也就是说它不能作为read或write的第一个参数。然而TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后发生的是正常的TCP连接终止序列。
我们可以通过SO_LINGER套接字选项可以用来改变TCO套接字的这种默认行为。
终止网络连接的通常方法是调用close函数。不过close有两个限制,却可以使用shutdown来避免。
(1)close把描述符的引用计数减1,仅在该计数变为0时才关闭套接字。使用shutdown可以不管引用计数就激发TCP的正常连接终止序列。
(2)close终止读和写两个方向的数据传送。既然TCP连接是全双工的,有时候我们需要告知对端我们已经完成了数据发送,即使对端仍然有数据要发送给我们。
#include <sys/socket.h>
int shutdown(int sockfd,int howto);返回:若成功则为0,若出错则为-1
该函数的行为依赖于howto参数的值:
- SHUT_RD 关闭连接的读这一半,套接字中不在有数据可接收,而且套接字接收缓冲区中的现有数据都被丢失。进程不能再对这样的套接字调用任何读函数。对一个TCP套接字这样调用shutdown函数后,由该套接字接收的来自对端的任何数据都被确认,然后悄然丢弃。
- SHUT_WR 关闭连接的写这一半,对于TCP套接字,这称为半关闭。当前留在套接字发送缓冲区中的数据将被发送掉,后跟TCP的正常连接终止序列。我们已经说过了,不管套接字描述符的引用计数是否等于0,这样的写半部关闭照样执行。进程不能再对这样的套接字调用任何写函数。
- SHUT_RDWR 连接的读半部和写半部都关闭,这与调用shutdown两次等效:第一次调用指定SHUT_RD,第二次调用指定SHUT _WR。
转载于:https://www.cnblogs.com/wangfengju/p/6172583.html
UNIX网络编程——shutdown 与 close 函数 的区别相关推荐
- linux网络编程--shut_down和close()函数的区别
在Linux C网络编程中,一共有两种方法来关闭一个已经连接好的网络通信,它们就是close函数和shutdown函数,它们的函数原型分别为: 1 #include<unistd.h> 2 ...
- UNIX网络编程-listen函数及其包裹函数介绍
UNIX网络编程-listen函数及其包裹函数介绍 函数简介 #include<sys/socket.h>int listen(int sockfd,int backlog);返回:若成功 ...
- 网编编程必看书籍:unix网络编程
unix网络编程被誉为圣经,该书主要讲socket套接字相关,socket API,从底层剖析网络编程.网络编程中需要用到的一些经典函数,多路复用函数,这些都值得去反复学习研究. 目录: 录 Part ...
- UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select ...
- UNIX网络编程之旅-配置unp.h头文件环境
最近在学习Unix网络编程(UNP),书中steven在处理网络编程时只用了一个#include "unp.h" 相当有个性并且也很便捷 于是我把第三版的源代码编译实现了这个过程 ...
- 转载|网络编程中阻塞式函数的底层逻辑
逛知乎看到的,觉得写的挺透彻的,转载一下,原文链接:Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗? 原文以阻塞式的recv函数作为讲解,但是所有阻塞式的api底层逻辑基本相通. ...
- UNIX网络编程学习笔记(代码超详细解析)(持续更新)
1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
- unix网络编程 str_cli epoll 非阻塞版本
unix网络编程 str_cli epoll 非阻塞版本 unix网络编程str_cli使用epoll实现讲了使用epoll配合阻塞io来实现str_cli,这个版本是配合非阻塞io. 可以看到采用非 ...
最新文章
- diy高性能存储服务器,diy存储服务器
- 计算机键盘上的哪个键可以复制,复制电脑键盘按什么
- vim简单使用教程【转】
- PyTorch基础(九)----- torch.mean()方法
- TC工具后台模式_如何用WRF模式模拟台风个例
- Angular应用动态创建style标签页的场景
- P2579,jzoj2288-[ZJOI2005]沼泽鳄鱼【矩阵乘法】
- 本地方法(JNI)——数值参数与返回值
- 阿里云CDN操控2.0版本正式发布
- 关于bash中if语法结构的广泛误解(转)
- .NET Framework 1.1 中 SmartNavigation 的实现
- ipv6单播地址包括哪两种类型_探秘联接|技术小课堂之BRAS设备IPv6地址分配方式...
- 测测你写了多少行代码【转】
- ctags linux,ctags --- 每天一个 Linux 命令
- 如何把多张图片快速的拼接在一起?如何拼接多张图片?
- Gif动图如何自制?一招教你快速完成gif制作
- 网络词汇泛滥:神马都是浮云?
- 如何使用自动化测试进行Android UI测试
- python彩色蟒蛇绘制
- visio模板#科研绘图#visio#技术路线图#文献汇报思路