【网络基础-套接字关闭】面试BAT因为close被拒(close与shutdown以及SO_LINGER属性(精讲))

本文深入探讨了在TCP连接终止时,如何使用close和shutdown函数关闭套接字,以及它们的区别。close函数会尝试发送剩余数据并触发四次挥手,而shutdown则提供了关闭读、写或两者的能力。此外,文章还介绍了SO_LINGER套接字选项,它允许控制close的行为,包括是否等待数据发送完成或立即返回。
摘要由CSDN通过智能技术生成

人们的视线总是会指向那些他们有兴趣靠近、试探、寻找或者拥有的东西。---摘自:《人生十二堂课》

当一个TCP连接终止时,需要调用close或者shutdown函数来关闭对应的套接字。那么对于这两个关闭接口,各自适用于什么情况呢,有什么不同呢?以及如何通过套接字属性控制它们产生不同的行为呢?

下面我们就来详细说一说close以及shutdown函数的用法以及它们的区别:

close:关闭套接字

#include <unistd.h>
int close(int sockfd);
返回值:成功:0 出错:-1    
参数:sockfd:要关闭的套接字描述符

功能:close一个TCP套接字的默认行为是把该套接口做上“已关闭”标记,并立即返回到进程。

这个套接字不能再为进程所用:它不能作为read或write函数的第一个参数。但TCP将试图发送已在发送队列中待发的任何数据,然后按正常的TCP连接终止序列进行操作(四次挥手)。图示如下图1:

                                图1:调用close函数执行过程

为了更好的理解close函数的功能,我们需要引用一个“描述符引用计数”的概念。

描述符引用计数:

对于套接字是和linux文件一样有“引用计数”的属性的,如果一个服务器通过fork函数创建子进程来对已连接套接字(sockfd)进行处理,那么当它调用完fork后,已连接套接字描述符(sockfd)的引用计数就从一变成了二(类似于硬连接)。对sockfd调用close将使其引用计数的值从二减为一。并不会触发TCP的四次挥手函数。只有当套接字的引用计数为0时,才会关闭套接字触发TCP的四次挥手。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值