linux+tcp+被关闭,Linux C/C++面试之《网络编程系列》(5) 理解tcp半打开、半关闭、半连接...

这些并非臆造出来的问题,而是实际会开发遇到的问题。对于一个健壮的网络服务器,应该考虑如何处理连接异常。

一、半开连接

TCP的半开连接是指TCP连接的一端异常崩溃,或者在未通知对端的情况下关闭连接,这种情况下不可以正常收发数据,否则会产生RST。比如一个常见的情况是TCP连接的一端异常断电,就会导致TCP的半开连接。如果没有数据传输,对端就不会知道本端的异常而一直处于ESTABLISHED状态(TCP有存活检测机制,后面内容我们会进行介绍)。

二、半关连接

当TCP连接中A发送FIN请求关闭,B端回应ACK后(A端进入FIN_WAIT_2状态),如果B没有立即发送FIN给A时,A方处在半连接状态,此时A可以接收B发送的数据,但是A已不能再向B发送数据。

如下图所示,在红色背景文本框标注的数据传输场景下就是TCP的半关连接:

ff5e18367df910cdf117a442fd30f201.png

从程序的角度,可以使用API来控制实现半连接状态。

```c

include

int shutdown(int sockfd, int how);

sockfd: 需要关闭的socket的描述符

how: 允许为shutdown操作选择以下几种方式:

SHUT_RD(0): 关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值