Linux 网络编程详解九
TCP/IP协议中SIGPIPE信号产生原因
.假设客户端socket套接字close(),会给服务器发送字节段FIN;
.服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所以服务器仍然可以向客户端发送数据。
.如果这种状态下服务器向客户端发送数据,将会引起TCP/IP协议进行RST段重置,导致服务器向当前进程发送SIGPIPE信号,
SIGPIPE信号的默认动作是关闭当前进程。
SIGPIPE信号产生的本质原因是管道的一端已经关闭,另一端却继续写入数据。
所以在网络编程中必须要捕捉SIGPIPE信号,因为不确定哪个端会突然close()。
close()函数详解
close()函数关闭文件读写两个数据传输方向。
close()的本质是文件引用计数原理,例如进程在fork()之前打开一个文件描述符fd,那么子进程的文件描述符本质上是文件表中描述符引用加一,
父进程中调用close(fd),文件表中描述符引用减一,直到子进程同样调用close(fd),文件表中描述符引用为0,此时文件才会真正关闭。
在TCP/IP协议中,假设在服务器端,父进程负责accept()连接,子进程负责与客户端通信交互,如果一个客户端socket文件描述符,
在父进程中没有调用close()函数关闭socket文件描述符,但是在子进程中调用close()函数关闭了socket文件描述符,那么子进程将无
法使用这个socket文件描述符read()或者send()数据,但是这个socket文件描述符仍然存在,因为父进程还引用着这个socket文件描述
符,文件表中的描述符引用不是0,因此服务器端不会向客户端发送FIN字节段,客户端就不会知道服务器端实际上已经无法read和send数据,
导致客户端可以发送数据,却接收不到数据,并且网络TCP/IP协议的状态都是ESTABLISHED状态(已连接状态)。所以多进程的服务器端需
要在父进程中关闭客户端socket文件描述符。
shutdown()函数详解
int shutdown(int sockfd, int how);
功能:shutdown()函数也可以用来关闭文件描述符,但是可以通过参数how来设置单独的关闭文件的读或者写
参数how
--SHUT_RD 关闭文件读数据传输
--SHUT_WR 关闭文件写数据传输
--SHUT_RDWR 关闭文件读写数据传输
shutdown的技术原理和close()函数不同,shutdown()函数不论文件表中文件描述符被引用了多少次,只要调用一次shutdown()函数,就可以真正意义上将文件关闭。
shutdown一般用法是关闭文件单个的读写数据传输。
Linux 网络编程详解九的更多相关文章
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- Linux 网络编程详解二(socket创建流程、多进程版)
netstat -na | grep " --查看TCP/IP协议连接状态 //socket编程提高版--服务器 #include <stdio.h> #include < ...
- Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...
- Linux 网络编程详解十一
/** * read_timeout - 读超时检测函数,不含读操作 * @fd:文件描述符 * @wait_seconds:等待超时秒数,如果为0表示不检测超时 * 成功返回0,失败返回-1,超时返 ...
- Linux 网络编程详解十
select int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *tim ...
- Linux 网络编程详解五(TCP/IP协议粘包解决方案二)
ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...
- Linux 网络编程详解四(流协议与粘包)
TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...
- Linux 网络编程详解十二
UDP的特点 --无连接 --基于消息的数据传输服务 --不可靠 --UDP更加高效 UDP注意点 --UDP报文可能会丢失,重复 --UDP报文可能会乱序 --UDP缺乏流量控制(UDP缓冲区写满之 ...
- Linux 网络编程详解八
TCP/IP协议三次握手机制 TCP/IP是全双工通道,两端都可以读写,三次握手机制就是验证TCP/IP是否是全双工通道 1.客户端调用connect()函数,阻塞客户端进程,客户端向服务器发送数据包 ...
随机推荐
- JQuery制作简单的网页导航特效
使用JQuery中hover()方法,使其根据鼠标的移动简单的改变背景颜色; hover();用于模拟鼠标指针悬停事件,当鼠标指针移动到元素上时,会触发指定的第一个函数,当鼠标指针移除这个元素时,会触 ...
- 悟语 KISS 简单至上 keep it simple stupid
引自 PostgreSQL Server Programming-Second Edition page81: 大部分时候,我们不需要快速的代码,而是能用的程序. remember that most ...
- HttpModule
HttpModule是如何工作的 当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,Htt ...
- u盘安装CENTOS后,启动missing operating system ,只能用U盘才能启动系统
好久之前就想把家里闲置的那台老的不能再老的笔记本换成linux的,用来学习 从N久之前用光盘安装的时候发现光驱坏掉了之后就没有再装过,最近又想安装于是就试了U盘安装 U盘安装过程也很简单,只需要制作一 ...
- 烂泥:mysql修改本地主机连接
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在mysql数据库安装完毕后,为了能远程连接管理mysql数据库.我们一般是在mysql服务器上通过update命令来更新user表中的host记录的. ...
- ubuntu同时安装qt4.8和qt5.7
这是ubuntu默认安装(从apt安装)的路径和相关文件,建议编译安装到/opt目录下,使用./configure --prefix=/opt/Qt4.8 /usr/share/qt4 /usr/sh ...
- HDFS的Trash回收站功能
文件的删除和恢复 和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,在系统回收站中都一个周期, ...
- java基础算法之冒泡排序
接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种 ...
- AngularJS Filters
过滤器可以使用一个管道字符(|)添加到表达式和指令中. AngularJS 过滤器 AngularJS 过滤器可用于转换数据: 过滤器 描述 currency 格式化数字为货币格式. filter 从 ...
- [No000050]练习一万小时便能成为天才
练习一万小时便能成为天才 世界上顶尖的记忆高手都是训练出来的! 加拿大畅销书作家麦尔坎·葛拉威尔在<异数>一书中指出:"人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了 ...