1.close()函数

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

close 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用进程,该套接字描述符不能再由调用进程使用,也就是说它不能再作为read或write的第一个参数,然而TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后发生的是正常的TCP连接终止序列。

在多进程并发服务器中,父子进程共享着套接字,套接字描述符引用计数记录着共享着的进程个数,当父进程或某一子进程close掉套接字时,描述符引用计数会相应的减一,当引用计数仍大于零时,这个close调用就不会引发TCP的四路握手断连过程。

2.shutdown()函数

#include<sys/socket.h>
int shutdown(int sockfd,int howto);  //返回成功为0,出错为-1.

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

1.SHUT_RD:值为0,关闭连接的读这一半。

2.SHUT_WR:值为1,关闭连接的写这一半。

3.SHUT_RDWR:值为2,连接的读和写都关闭。

终止网络连接的通用方法是调用close函数。但使用shutdown能更好的控制断连过程(使用第二个参数)。

3.两函数的区别

close函数会关闭套接字ID,如果有其他的进程共享着这个套接字,那么它仍然是打开的,这个连接仍然可以用来读和写,并且有时候这是非常重要的 ,特别是对于多进程并发服务器来说。

shutdown会切断进程共享的套接字的所有连接,不管这个套接字的引用计数是否为零,那些试图读得进程将会接收到EOF标识,那些试图写的进程将会检测到SIGPIPE信号,同时可利用shutdown的第二个参数选择断连的方式。

下面将展示一个客户端例子片段来说明使用close和shutdown所带来的不同结果:

客户端有两个进程,父进程和子进程,子进程是在父进程和服务器建连之后fork出来的,子进程发送标准输入终端键盘输入数据到服务器端,知道接收到EOF标识,父进程则接受来自服务器端的响应数据。

   /* First  Sample client fragment,* 多余的代码及变量的声明已略       */s=connect(...);if( fork() ){   /*      The child, it copies its stdin to the socket              */while( gets(buffer) >0)write(s,buf,strlen(buffer));close(s);exit(0);}else {          /* The parent, it receives answers  */while( (n=read(s,buffer,sizeof(buffer)){do_something(n,buffer);/* Connection break from the server is assumed  *//* ATTENTION: deadlock here                     */wait(0); /* Wait for the child to exit          */exit(0);}

对于这段代码,我们所期望的是子进程获取完标准终端的数据,写入套接字后close套接字,并退出,服务器端接收完数据检测到EOF(表示数据已发送完),也关闭连接,并退出。接着父进程读取完服务器端响应的数据,并退出。

然而,事实会是这样子的嘛,其实不然!子进程close套接字后,套接字对于父进程来说仍然是可读和可写的,尽管父进程永远都不会写入数据。因此,此socket的断连过程没有发生,因此,服务器端就不会检测到EOF标识,会一直等待从客户端来的数据。而此时父进程也不会检测到服务器端发来的EOF标识。这样服务器端和客户端陷入了死锁(deadlock)。如果用shutdown代替close,则会避免死锁的发生。

     if( fork() ) {  /* The child                    */while( gets(buffer)write(s,buffer,strlen(buffer));shutdown(s,1); /* Break the connection*for writing, The server will detect EOF now. Note: reading from*the socket is still allowed. The server may send some more data*after receiving EOF, why not? */exit(0);}

linux :shutdown() 与 close()函数详解相关推荐

  1. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

  2. linux中recvfrom读取速度,Linux系统调用-- recv/recvfrom 函数详解

    Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...

  3. linux内核 recvfrom,Linux系统调用-- recv/recvfrom 函数详解

    Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...

  4. linux rcu 用法,synchronize_rcu()函数详解

    二.代码详解 定义在:linux/kernel/rcupdate.c 606/** 607 * synchronize_rcu - wait until a grace period has elap ...

  5. linux网络编程常用函数详解与实例(socket--bind--listen--accept)

    常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...

  6. 网络编程之shutdown() 与 close()函数详解

    1.close()函数 [cpp] view plaincopyprint? <span style="font-size:13px;">#include<uni ...

  7. 【Linux系列】signal函数详解

    Date: 2023.1.18 文章目录 1.介绍 2.如何安装多个处理函数 3.信号列表 转载自:http://imhuchao.com/2300.html signal作用是为信号注册一个处理器. ...

  8. linux shutdown命令以及参数详解

    在说shutdown命令之前 先说一下sync命令: sync:将内存中尚未写入硬盘的数据写入硬盘 因为linux为了保证数据读写速度,把常用的数据放在内存中,不会立即写入硬盘,如果有不当关机,这些数 ...

  9. Linux 系统 文件锁 fcntl函数详解

    #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int ...

最新文章

  1. 嵌入式多媒体设计7--QDockWidget大小调整及隐藏标题
  2. 乐高积木搭建微型地球仪,lego微型地球仪搭建详细流程
  3. JavaScript -- 时光流逝(三):js中的 String 对象的方法
  4. 未来教育计算机二级为什么分数很低,计算机二级考试失分了却不知道为什么?...
  5. 基线系统需要受到更多关注:基于词向量的简单模型 | ACL 2018论文解读
  6. Hive中COUNT的高级用法(条件过滤等)
  7. Handler实现数据模板
  8. 笔记:企业内部因素评价
  9. MATLAB中的微积分运算(数值符号)
  10. html优先级和层叠性
  11. PHP composer作用,php-composer作用分析
  12. grads插值_利用grads描述文件中的pdef做插值的实用方法,转模式的同学看过来~~...
  13. 【老生谈算法】基于matlab时域频域处理的语音信号变声处理系统设计与算法原理(论文+程序源码+GUI图形用户界面)——变声算法
  14. 你知道全中国有多少个火车站吗?
  15. 泰晤士计算机专业排行,泰晤士2021世界大学学科排名:世界大学计算机学科排名...
  16. 萨达萨达发神鼎飞丹砂
  17. 模N计数器-计数+使能信号
  18. 鼓励参与计算机考试宣传标语,考试宣传标语34句
  19. 遗传算法(Genetic Algorithm)详解与实现
  20. Java模拟微信发红包,一看就会

热门文章

  1. 借着这朵“云” ofo已在全球4个国家同步运营
  2. javascript 调用html文件,HTML如何调用JavaScript?
  3. AutoML系列 | 01-自动化机器学习技术原理
  4. 创建局域网内的Git远程仓库,可实现局域网内用户的推送和拉取代码
  5. IOCP 简单的完成端口读写文件
  6. 隐藏video下载按钮
  7. c语言装逼编程,教你用C语言写一个好玩的万年历,必备的装逼神器
  8. 第一集 斗罗世界 第七章
  9. node 生产的env文件怎么注入_前端各种文件上传攻略,从小图片到大文件断点续传...
  10. c语言将英文逗号转成中文逗号,Word中怎样把文中的英文逗号改成中文逗号?