14. TCP套接字之shutdown函数

本文分析了TCP套接字中因客户端过早关闭导致的数据丢失问题,并介绍了如何使用`shutdown`函数来解决这个问题。通过关闭套接字的读或写端,实现半关闭状态,确保数据完整传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前面我们虽然解决了困惑我们很久客服端的问题, 但是虽然解决了但是该客服端还有更加大的隐患存在, 接下来我们就来看一下问题所在和问题解决办法.


问题浮现

使用前面IO复用之select 的客服端和服务端都改写成的完整代码做实验.

完整代码 : select_server_client.c

服务端运行:

 ./a.out 1 8080 127.0.0.1

客服端运行:

./a.out 2 8080 127.0.0.1 < select_service_client.c 

客服端输入一段代码进行回显即可, 实验结果如下:

在这里插入图片描述

可以看到, 客服端并没有完整的接收到所有的数据就关闭了, 难道丢失数据了? 服务端为什么也关闭?

怎么回事, 怎么越改越错, 完全不如之前的IO分离了. 不急不急, 找到bug问题所在就容易解决了.


问题分析

通过抓包我们来分析, 抓包结果如下 :

在这里插入图片描述

可以看到服务端很认真的将数据发送给客服端, 但是客服端发送完数据之后就直接关闭了, 而服务端并没有完整的将数据发送完; 当客服端关闭后服务端再发送数据就收到RET. 所以后面服务端的数据就丢失了, 客服端并没有收到所有的数据.

问题所在就是客服端关闭的太早了, 并没有正常的四次挥手就关闭了. 看来客服端不能直接close关闭套接字, 而是应该等待把服务端发送过来的所有数据全部接收完了后调用 close才行, 但是 close没有办法判断什么时候读完啊.

接下来介绍shutdown函数来解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值