Linux socket关闭连接shutdown与close
在Linux socket关闭连接的方法有两种分别是shutdown和close,首先看一下shutdown的定义
#include<sys/socket.h>
int shutdown(int sockfd,int how);
how的方式有三种分别是
SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。
SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作。
SHUT_RDWR(2):关闭sockfd的读写功能。
成功则返回0,错误返回-1,错误码errno:EBADF表示sockfd不是一个有效描述符;ENOTCONN表示sockfd未连接;ENOTSOCK表示sockfd是一个文件描述符而不是socket描述符。
close的定义如下:
#include<unistd.h>
int close(int fd);
关闭读写。
成功则返回0,错误返回-1,错误码errno:EBADF表示fd不是一个有效描述符;EINTR表示close函数被信号中断;EIO表示一个IO错误。
下面摘用网上的一段话来说明二者的区别:
close-----关闭本进程的socket id,但链接还是开着的,用这个socket id的其它进程还能用这个链接,能读或写这个socket id
shutdown--则破坏了socket 链接,读的时候可能侦探到EOF结束符,写的时候可能会收到一个SIGPIPE信号,这个信号可能直到
socket buffer被填充了才收到,shutdown还有一个关闭方式的参数,0 不能再读,1不能再写,2 读写都不能。
socket 多进程中的shutdown, close使用
当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:
close(sockfd);
你也可以调用shutdown()函数来关闭该socket。该函数允许你只停止在某个方向上的数据传输,而一个方向上的数据传输继
续进行。如你可以关闭某socket的写操作而允许继续在该socket上接受数据,直至读入所有数据。
int shutdown(int sockfd,int how);
Sockfd是需要关闭的socket的描述符。参数 how允许为shutdown操作选择以下几种方式:
SHUT_RD:关闭连接的读端。也就是该套接字不再接受数据,任何当前在套接字接受缓冲区的数据将被丢弃。进程将不能对该
套接字发出任何读操作。对TCP套接字该调用之后接受到的任何数据将被确认然后无声的丢弃掉。
SHUT_WR:关闭连接的写端,进程不能在对此套接字发出写操作
SHUT_RDWR:相当于调用shutdown两次:首先是以SHUT_RD,然后以SHUT_WR
使用close中止一个连接,但它只是减少描述符的参考数,并不直接关闭连接,只有当描述符的参考数为0时才关闭连接。
shutdown可直接关闭描述符,不考虑描述符的参考数,可选择中止一个方向的连接。
注意:
1>. 如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套
接字将被释放。
2>. 在多进程中如果一个进程中shutdown(sfd, SHUT_RDWR)后其它的进程将无法进行通信. 如果一个进程close(sfd)将不会
影响到其它进程. 得自己理解引用计数的用法了. 有Kernel编程知识的更好理解了.
转载于:https://blog.51cto.com/jianshusoft/832879
Linux socket关闭连接shutdown与close相关推荐
- linux socket关闭连接 shutdown与close
在Linux socket关闭连接的方法有两种分别是shutdown和close,首先看一下shutdown的定义 #include<sys/socket.h>int shutdown(i ...
- linux socket关闭并释放资源,【linux】centos 上 php-fpm 占用太多状态为 CLOSED 的 socket 且不释放, 如何解决?...
[[email protected] ~]$ ss -s Total: 83678 (kernel 0) TCP: 84982 (estab 127, closed 84812, orphaned 0 ...
- linux socket全连接/半连接 队列
从Linux源码看Socket(TCP)的listen及连接队列_无毁的湖光-Al的博客-CSDN博客 1. 为什么要存在半连接队列 因为根据TCP协议的特点,会存在半连接这样的网络攻击存在,即不停的 ...
- linux socket 错误 Transport endpoint is not connected 在 recv shutdown 中的触发时机
1.recv触发情况 用错了socket,把监听socket 和 连接socket 错误使用.实例如下: for(;;){socklen_t len = sizeof(client_address); ...
- c语言linux TCP长连接 socket收发范例 断开自动重连
原文链接:https://blog.csdn.net/chenhao0568/article/details/103420615 c语言linux TCP长连接 socket收发范例 断开自动重连 改 ...
- linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...
- socket 长链接linux,手把手教你写 Socket 长连接
原标题:手把手教你写 Socket 长连接 8点43分打卡 就是真爱 本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号玉刚说所有,未 ...
- socket关闭close和shutdown
转载:http://blog.sina.com.cn/s/blog_693de6100101eusw.html 概述 socket关闭有2个方法close,shutdown ,2个方法的用法需要注意 ...
- socket关闭的close和shutdown区别
转自:http://hi.baidu.com/yoshubom/blog/item/caa3b2de5d210559cdbf1a2b.html socket关闭close和shutdown socke ...
最新文章
- AMNO.6 给出一个不多于5位的整数,要求 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字,例如原数为321,应输出123 输入 一个不大于5位的数字
- 窗口函数(防忘笔记)
- 如何去设计一个自适应的网页设计或HTMl5
- ASP.Net TextBox只读时不能通过后台赋值取值
- Entity Framework 学习结束语
- Java中 ArrayList类常用方法和遍历
- 再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!
- JavaScript学习(七)—元素节点的获取方式
- GDAL源码剖析(十三)之GDAL网格插值说明
- Dart 基础篇-所有知识点架构
- [MDB] EXP 导入数据库
- 数据库系统load飙高问题解决思路(转)
- Ghost 备份、还原使用图解,带下载
- 火狐浏览器安装插件“组件未验证无法安装”问题解决
- 选择SOA平台的标准是什么?
- 工作分解结构(WBS)
- IT6801FN图像质量调优
- 计算机的操作系统是什么与什么的接口,计算机中操作系统是什么的接口
- SDM人脸对齐算法研究
- godaddy plesk mysql_» Godaddy的Plesk面板语言更改图文详细教程
热门文章
- 【Linux】ubuntu系统VMware Tools(文件共享、全屏...)3步完成安装过程亲测可用
- 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
- 【行业进展】国内自动驾驶发展的怎么样了?
- 中国拉丝蛋白行业未来发展趋势与盈利前景研究报告2022年
- “一带一路”谋定沿边开放发展-刘虹飞:经信研究形成共识
- openresty开发系列11--openresty的api入门
- 1088 三人行(20 分)
- JUnit 测试含有控制台输入的方法
- [NOIP2012提高组]国王游戏
- memcpy实例(一)