windows 下 socket 的 shutdown 和 closesocket 的区别_shutdown socket windows-程序员宅基地

技术标签: c++  winsock  closesocket  计算机网络  shutdown  

It is important to distinguish the difference between shutting down a socket connection and closing a socket.
分辨关闭(shutdown)一个socket连接和关闭一个socket的区别是重要的。

以下为了区分二者,分别用英文的shutdown和close表述。

shutdown a socket connection

shutdown一个socket连接涉及到两个端点 (endpoint) 间协议消息的交换,以下称为shutdown序列 (sequence)。
有两种shutdown序列:

  • 优雅的 (graceful)
  • 强硬的 (abortive (also called hard))

优雅shutdown,顾名思义,就是比较优雅,如何个优雅法呢?我们知道,当应用层将要传输的数据传递给传输层时,传输层不一定会马上进行传输,而是有一个等待队列,所以在shutdown时,队列中还有未发送的消息。把未发送的数据发送完再关闭连接,就是优雅shutdown。因为我们正常来说应该预期应用层发送的消息应该被完成发送,所以这种shutdown方式比较优雅。
相反,强硬shutdown就是丢弃等待队列中的消息。
shutdown序列的发送也会被用来给相关应用层提供一个 FD_CLOSE 指示,来提示应用层有一个shutdown正在进行。

close a socket

而close一个socket是另外一个含义,它会使得socket句柄1被释放,这样应用程序就不能再以任何方式引用或使用该套接字。

在Windows Socket下,有两个函数可以用来发起一个shutdown序列,分别是shutdownWSASendDisconnect。而closesocket函数用于释放套接字句柄并释放任何相关资源。
容易引起困惑的是,closesocket函数会隐式地引发一个shutdown序列(如果序列还没发生的话)。事实上,使用closesocket来发起shutdown序列并释放socket句柄已成为一个普遍的编程实践。

为了促进这一使用,socket接口提供了控制机制,通过套接字选项允许程序员指明隐含的shutdown序列是应该优雅还是强硬,和指明closesocket函数是否应该逗留 (linger) 以允许优雅的shutdown序列有时间完成。这些重要的区别和以这种方式使用closesocket的后果仍然没有被广泛理解。

我们来看看linger的数据结构:

typedef struct linger {
    
  u_short l_onoff;
  u_short l_linger;
} LINGER, *PLINGER, *LPLINGER;

下面对其数据成员进行分析。

  • l_onoff

    含义
    0 socket 不会保持开启,为默认值
    非0 socket 会保持开启一段特定时间
  • l_linger
    指明了在closesocket调用之后,为了允许等待队列中的数据被发送而保持socket开启的时间,以秒为单位,只在 l_onoff 为非零值的时候有效。

以上数据结构可以通过setsockopt 函数设置,optnameSO_LINGERoptvallinger 数据结构。也可以通过设置 optnameSO_DONTLINGER 来设置 l_onoff 的值。

closesocket函数的语义会受linger结构值得影响,如下:

l_onoff l_linger Type of close Wait for close?
zero Do not care Graceful close No
nonzero zero Hard Yes, but l_linger is zero, so the waiting time is zero, equivalent to No
nonzero nonzero Graceful if all data is sent within timeout value specified in the l_linger member.Hard if all data could not be sent within timeout value specified in the l_linger member. Yes

值得注意的是,linger的含义是逗留,即是否阻塞,并不是是否为优雅关闭。

优雅关闭并不一定需要等待,比如 l_onoff 默认值为 0,此时调用closesocket之后,closesocket会立刻返回,但等待队列中的数据仍然在传输层发送着,并且在某段时间内,Windows Sockets provider不能释放这个socket和其他资源,也就是说其他应用程序仍然可以使用该socket。
原文:

If the l_onoff member of the LINGER structure is zero on a stream socket, the closesocket call will return immediately and does not receive WSAEWOULDBLOCK whether the socket is blocking or nonblocking. However, any data queued for transmission will be sent, if possible, before the underlying socket is closed. This is also called a graceful disconnect or close. In this case, the Windows Sockets provider cannot release the socket and other resources for an arbitrary period, thus affecting applications that expect to use all available sockets. This is the default behavior for a socket.

而当l_onoff被设为非零值时,就不一定是优雅shutdown了,此时closesocket会阻塞直到队列中的数据被发送完毕或者l_linger设置的时间已到。如果等待队列中的数据不能在l_linger时间内发送完毕,那么剩下的就会被丢弃。所以当l_onoff为非零值时,相当于有一定的时间容忍等待队列的数据继续发送。


参考:
[1] Graceful Shutdown, Linger Options, and Socket Closure
[2] LINGER structure
[3] closesocket function


  1. handle: A handle is the part of an object such as a tool, bag, or cup that you hold in order to be able to pick up and use the object. “柄、把”的意思,比如门把手,socket handle经常被翻译成“句柄”感觉有点难理解,其实就像门把手,socket句柄就是用来使用socket的,我们通过操作socket文件描述符来操作对应的socket,所以这里的句柄指的就是socket的文件描述符。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Runner1st/article/details/100131195

智能推荐

centos8使用命令修改主机名_centos8stream 关于的名称-程序员宅基地

文章浏览阅读1.1k次。hostnamectl set-hostname layuiFilehostname #查看主机名然后先跳到普通用户再exit退到root看其生效或reboot重启生效_centos8stream 关于的名称

安卓高手之路之图形系统(6)requestLayout的流程_kotlin requestlayout-程序员宅基地

文章浏览阅读1.1w次。当一个View调用requestLayout的时候,会给当前的View设置一个FORCE_LAYOUT标记。由此向ViewParent请求布局。这样从这个View开始向上一直requestLayout。最终到达ViewRootImpl。ViewParent 就是当前的传输链。【参见职责链设计模式】 第一步。ViewRootImpl发现请求了布局。那么就会调用measure方_kotlin requestlayout

python opencv 灰度图转换和resize函数的使用_python cv2 resize(img1, ())-程序员宅基地

文章浏览阅读1.7k次。import cv2import numpy as npimg1 = cv2.imread('left.png',1)img1 = cv2.resize(img1, (797,1212))dst1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)cv2.imwrite('l.png',dst1)img1 = cv2.imread('left.png',1..._python cv2 resize(img1, ())

Socket基础六:基于数据报套接字的网络程序(udp丢包测试)_数据报套接字 丢包测试-程序员宅基地

文章浏览阅读656次。Socket基础五:基于数据报套接字的网络程序(udp丢包测试)作者:刘磊 2020.4.27   参考书目:《Windows网络编程》刘琰等著一、功能函数1、int udp_server_fun_packetloss(SOCKET s){ int iResult = 0; int count = 0; struct sockaddr_in cliaddr; int addrlen = sizeof(sockaddr_in); char recvline[MAXLINE]; do_数据报套接字 丢包测试

国内elasticsearch和kibana镜像、ik分词器_ik分词器国内镜像-程序员宅基地

文章浏览阅读1.6k次。发现华为云有一个好用的国内镜像kibana各个版本下载地址:https://mirrors.huaweicloud.com/elasticsearch/kibana各个版本下载地址:https://mirrors.huaweicloud.com/kibana/ik分词器各个版本下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases亲测下载速度非常快..._ik分词器国内镜像

UI自动化测试-程序员宅基地

文章浏览阅读1k次。UI自动化是一个运用非常广泛的技术,想要深入精通是需要我们不断地积累,沉淀的,这样才能解决一个又一个的难题,从而使我们的项目质量更上一个台阶。_ui自动化

随便推点

2024年软件测试工具总结 —— 性能测试工具_magicotp,软件测试基础入门_web页面性能测试工具-程序员宅基地

文章浏览阅读512次,点赞19次,收藏12次。WebLOAD是一款针对Web应用程序的企业级负载和性能测试工具,提供性能、完整性和可伸缩性测试等功能,能够同时模拟数千个用户,因此您可以测试重流量负载,并报告应用程序中的弱点、约束和性能瓶颈。它是一个以开发人员为中心(当然,测试人员亦可以使用,因为真的很方便),免费和开源的负载测试工具,旨在使性能测试具有生产力和令人愉悦的体验,可最大程度地减少系统资源的消耗。在线性能监控是指借助监控工具,监控系统性能的实际数据,因为是真实数据,比研发环境中通过工具产生负载得到的测试结果更客观,更有分析价值。_web页面性能测试工具

Java进制转换, 数据类型, 运算符_java 32进制递增-程序员宅基地

文章浏览阅读511次。 1:进制转换转换规则:先把数据的每一位上的系数乘以对应基数的次幂(低位从零开始),然后相加即可十进制到其他进制规则:除基取余,直到商为0,最后将余数反转十进制到二进制: 除2取余,直到商为0,最后将余数反转 例: 十进制13对应的二进制数据是1101 二进制到十进制的技巧(8421码)十进制到八进制: 除8取余,直到商为0,最后将余数反转 例: ..._java 32进制递增

【前端】CSS水平居中的6种方法-程序员宅基地

文章浏览阅读2.1k次。左右两边间隔相等的居中。_css水平居中

pycharm中安装BeautifulSoup_pycharm安装beautifulsoup-程序员宅基地

文章浏览阅读9k次,点赞12次,收藏14次。0x00 为了学习爬虫技术,买了本用Python写网络爬虫,由于本人学的Python3,这本书是用python2.7. 故转战 python网络数据采集。按照这本书的内容,安装BeautifulSoup。0x01 0x02 0x03 0x04 0x05 由于python3的BeautifulSoup是搞在了bs4的里面的,故代码应该这么写from..._pycharm安装beautifulsoup

JetBrains家所有IDE保存时自动格式化代码: Clion/PyCharm/Intellij IDEA_jetrains rider 格式化文件-程序员宅基地

文章浏览阅读4.4k次,点赞6次,收藏12次。JetBrains家所有IDE保存时自动格式化代码: Clion/PyCharm/Intellij IDEA众所周知,JetBrains家的IDE使用体验非常好,可以很多从VSCode过来的小伙伴并不熟悉,本来在VSCode里面只需要在settings.json中一行简单的指令就可以解决在保存时自动格式化代码的问题,但是在JB全家桶中却难以实现,很多复杂的教程都让大家使用File Watcher或类似的工具来监视文件变化,不仅步骤繁琐,而且也无法在所有IDE上通用,今天给大家介绍一款JB全系可用的插件,非_jetrains rider 格式化文件

18软工实践 - 第七次作业 - 需求分析报告-程序员宅基地

文章浏览阅读335次。目录 组队后的团队项目的整体计划安排 项目logo及思维导图 项目logo 思维导图 产品思维导图 产品思维导图-引导 产品思维导图-后端数据处理、存储 产品思维导图-短信识别 产品思维导图-智能分析 ..._软工shijian需求分析

推荐文章

热门文章

相关标签