gpt4 book ai didi

c - 如何硬/中止关闭 TCP 连接?

转载 作者:可可西里 更新时间:2023-11-01 02:32:29 26 4
gpt4 key购买 nike

当一个 tcp 客户端与我的 TCP 服务器建立一个 tcp 连接时,在它发送了几个数据包后,我想在此 TCP 连接上进行硬/中止关闭,如何在 linux C 中执行?

此处的硬/异常关闭意味着 tcp 服务器将立即向客户端发送 RST。根本没有 FIN/ACK。

谢谢!

最佳答案

来自 Socket man page

SO_LINGER Sets or gets the SO_LINGER option. The argument is a linger structure.

struct linger {
int l_onoff; /* linger active */
int l_linger; /* how many seconds to linger for */
};

When enabled, a close(2) or shutdown(2) will not return until all queued messages for the socket have been successfully sent or the linger timeout has been reached. Otherwise, the call returns immediately and the closing is done in the background. When the socket is closed as part of exit(2), it always lingers in the background.

另一个设置:

setsockopt(..., SO_LINGER,...) 的效果取决于 linger 结构中的值(传递给 setsockopt() 的第三个参数)是什么:

情况一:linger->l_onoff为零(linger->l_linger无意义): 这是默认值。

在 close() 上,底层堆栈会在确保发送完所有未发送的数据后尝试正常关闭连接。在面向连接的协议(protocol)(如 TCP)的情况下,堆栈还确保发送的数据得到对等方的确认。堆栈将在后台执行上述正常关闭(在调用 close() 返回后),无论套接字是阻塞还是非阻塞。

情况 2:linger->l_onoff 非零且 linger->l_linger 为零:

close() 立即返回。底层堆栈丢弃任何未发送的数据,并且在面向连接的协议(protocol)(如 TCP)的情况下,向对等方发送 RST(重置)(这称为硬关闭或异常关闭)。对等应用程序对 read()/recv() 数据的所有后续尝试都将导致 ECONNRESET。

情况 3:linger->l_onoff 非零且 linger->l_linger 非零:

close() 将阻塞(如果是阻塞套接字)或以 EWOULDBLOCK 失败(如果非阻塞),直到正常关闭完成或 linger->l_linger 中指定的时间过去(超时)。超时时,堆栈的行为与上述情况 2 相同。

关于c - 如何硬/中止关闭 TCP 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16888429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com