tcp rst packet

本文探讨了在网络编程中遇到的ConnectionResetByPeer问题,并详细分析了其原因及两种解决方案:确保读取所有数据或使用shutdown加close组合。

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

研究生期间有一段时间就总被connection reset by peer折磨,昨天又遇到这种情况,郁闷,不得不搞清楚了

 

Shutting down a socket connection involves an exchange of protocol messages between the two endpoints, hereafter referred to as a shutdown sequence. Two general classes of shutdown sequences are defined: graceful and abortive (also called hard). In a graceful shutdown sequence, any data that has been queued, but not yet transmitted can be sent prior to the connection being closed. In an abortive shutdown, any unsent data is lost. The occurrence of a shutdown sequence (graceful or abortive) can also be used to provide an FD_CLOSE indication to the associated applications signifying that a shutdown is in progress.

 

意思就是说正常的流程是 data + FIN, 但也有可能是 data + rst + data, 后一种情况就是强制关闭,会导致客户端的connection reset by peer。

 

可以用linger这个选项来控制,setsockopt

 

但是,socket默认的情况就是如此,即会先发送数据,然后发送FIN,不会发送rst

 

所以,我遇到的问题不能用上面的方法来解决

 

我遇到的问题是,server没有读客户端发送的数据,而是直接发送数据,然后close,即在close的时候server的读缓存里还有数据

A                                            B
send( ) data →
data →
data →
recv( ) →ERROR ← RST close( )

 

解决方法包括:

1. 将所有数据读出

2. 调用shutdown,然后调用close

 

相关文章链接:

http://cs.baylor.edu/~donahoo/practical/CSockets/TCPRST.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值