在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相关推荐

  1. linux socket关闭连接 shutdown与close

    在Linux socket关闭连接的方法有两种分别是shutdown和close,首先看一下shutdown的定义 #include<sys/socket.h>int shutdown(i ...

  2. linux socket关闭并释放资源,【linux】centos 上 php-fpm 占用太多状态为 CLOSED 的 socket 且不释放, 如何解决?...

    [[email protected] ~]$ ss -s Total: 83678 (kernel 0) TCP: 84982 (estab 127, closed 84812, orphaned 0 ...

  3. linux socket全连接/半连接 队列

    从Linux源码看Socket(TCP)的listen及连接队列_无毁的湖光-Al的博客-CSDN博客 1. 为什么要存在半连接队列 因为根据TCP协议的特点,会存在半连接这样的网络攻击存在,即不停的 ...

  4. linux socket 错误 Transport endpoint is not connected 在 recv shutdown 中的触发时机

    1.recv触发情况 用错了socket,把监听socket 和 连接socket 错误使用.实例如下: for(;;){socklen_t len = sizeof(client_address); ...

  5. c语言linux TCP长连接 socket收发范例 断开自动重连

    原文链接:https://blog.csdn.net/chenhao0568/article/details/103420615 c语言linux TCP长连接 socket收发范例 断开自动重连 改 ...

  6. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

    2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...

  7. socket 长链接linux,手把手教你写 Socket 长连接

    原标题:手把手教你写 Socket 长连接 8点43分打卡 就是真爱 本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号玉刚说所有,未 ...

  8. socket关闭close和shutdown

    转载:http://blog.sina.com.cn/s/blog_693de6100101eusw.html 概述 socket关闭有2个方法close,shutdown ,2个方法的用法需要注意 ...

  9. socket关闭的close和shutdown区别

    转自:http://hi.baidu.com/yoshubom/blog/item/caa3b2de5d210559cdbf1a2b.html socket关闭close和shutdown socke ...

最新文章

  1. AMNO.6 给出一个不多于5位的整数,要求 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字,例如原数为321,应输出123 输入 一个不大于5位的数字
  2. 窗口函数(防忘笔记)
  3. 如何去设计一个自适应的网页设计或HTMl5
  4. ASP.Net TextBox只读时不能通过后台赋值取值
  5. Entity Framework 学习结束语
  6. Java中 ArrayList类常用方法和遍历
  7. 再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!
  8. JavaScript学习(七)—元素节点的获取方式
  9. GDAL源码剖析(十三)之GDAL网格插值说明
  10. Dart 基础篇-所有知识点架构
  11. [MDB] EXP 导入数据库
  12. 数据库系统load飙高问题解决思路(转)
  13. Ghost 备份、还原使用图解,带下载
  14. 火狐浏览器安装插件“组件未验证无法安装”问题解决
  15. 选择SOA平台的标准是什么?
  16. 工作分解结构(WBS)
  17. IT6801FN图像质量调优
  18. 计算机的操作系统是什么与什么的接口,计算机中操作系统是什么的接口
  19. SDM人脸对齐算法研究
  20. godaddy plesk mysql_» Godaddy的Plesk面板语言更改图文详细教程

热门文章

  1. 【Linux】ubuntu系统VMware Tools(文件共享、全屏...)3步完成安装过程亲测可用
  2. 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
  3. 【行业进展】国内自动驾驶发展的怎么样了?
  4. 中国拉丝蛋白行业未来发展趋势与盈利前景研究报告2022年
  5. “一带一路”谋定沿边开放发展-刘虹飞:经信研究形成共识
  6. openresty开发系列11--openresty的api入门
  7. 1088 三人行(20 分)
  8. JUnit 测试含有控制台输入的方法
  9. [NOIP2012提高组]国王游戏
  10. memcpy实例(一)