gpt4 book ai didi

c# - 如何防止 .NET 库在关闭时发送 RST 数据包

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

我正在做一些测试,试图隔离库 (.NET) 中的一些奇怪行为。当我通过 C++ 使用 Winsock API 并简单地调用 closesocket() 时,我看到 Windows 端发送 FIN/ACK 数据包,而远程端发回 ACK 数据包。这就是我所说的优雅结束。但是,在使用 C# 进行编程时,我没有看到所谓的优雅关闭。

在 C# 中,我打开我的套接字,然后在关闭它时,我看到 Windows 在第一次调用 Socket.Shutdown()发送一个 FIN 数据包。但是,无论如何,当我在 C# 中调用 Socket.Close() 时,都会发送一个 RST 数据包并且连接会立即断开。这让我感到困惑,因为根据我在网上阅读的内容,TCP 关闭过程应该是 FIN/ACK -> ACK(实际上从双方来看,但现在,我只关心“我的”方面);即根本不应该有 RST 数据包。据我所知,显然,只有当接收方不确定连接状态并想要退出时,才会发送 RST 数据包。

为什么这个 RST 数据包在 .NET 计划关闭时发送,而在 winsock API 计划关闭时根本不发送?有没有办法在从 .NET 正常关闭期间阻止 RST 数据包的传输?

如果这很重要,在两个代码路径中,我会在调用相应的 close() 方法之前读取套接字上的所有可用数据。

最佳答案

阅读 Socket.Close 的 .NET 文档,这是我发现的:

For connection-oriented protocols, it is recommended that you call Shutdown before calling the Close method. This ensures that all data is sent and received on the connected socket before it is closed. If you need to call Close without first calling Shutdown, you can ensure that data queued for outgoing transmission will be sent by setting the DontLinger Socket option to false and specifying a non-zero time-out interval. Close will then block until this data is sent or until the specified time-out expires. If you set DontLinger to false and specify a zero time-out interval, Close releases the connection and automatically discards outgoing queued data.

这实际上是有道理的。如果缓冲区中仍有数据(OS 一个)并且您断开连接或终止进程,连接将被重置(TCP 规范中的更多详细信息)。

关于何时发送 RST 查看 TCP Guide .

我的猜测是仍然有一些未设置或传输中的数据或触发 RST 的传出/传入缓冲区。

关于c# - 如何防止 .NET 库在关闭时发送 RST 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7164727/

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