【发布时间】:2021-11-20 07:06:38
【问题描述】:
我有一个用C 编写的服务器,如果连接在特定时间处于空闲状态,它会关闭连接。我有一个问题(很少发生)。客户端读取失败,显示Connection broken。我怀疑服务器正在关闭连接,而客户端正在同时发送一些数据。
考虑以下场景(A 是服务器,B 是客户端)
-
B发起连接,A和B之间的连接建立。 -
B处于空闲状态,已达到空闲超时。 -
A发起关闭 - 在
B收到来自A的FIN之前,它开始向A发送请求 -
B发送请求后,会读取响应
由于A 已经关闭连接,B 无法读取。
我的问题是
- 这是一种可能的情况吗?
- 如何处理客户端的空闲超时?
- 如何正确关闭
A和B之间的连接(过程中避免B发送请求)。简而言之,如何原子地关闭连接?
【问题讨论】:
-
你不应该使用代码格式来强调,代码格式用于代码。而是使用粗体或斜体,就像在 MS Word 中写信一样。
-
1.是的。 2. 如果超时时间为 5 秒,客户端不应允许消息之间超过一秒。如果客户端没有要发送的内容,并且已经过了一秒钟,那么它应该只发送一条保持活动消息,即没有内容的消息。根据需要调整超时值,但与保活率相比,超时应该足够大。 3. 在关闭连接之前(由于超时),服务器应该向客户端发送“检测到超时”消息。
-
我不能同意服务器发送超时消息的所有建议。此时,服务器必须假设连接已断开,并且可能断开,并且无论如何超时消息可能永远不会到达客户端,或者客户端可能无法正确响应:如果服务器然后关闭连接,客户端仍然可以得到
broken pipe。你只需要忍受broken pipe消息。所有超时消息和响应所做的只是为broken pipe添加更多机会。
标签: c linux sockets network-programming