我正在做一些测试,试图隔离库(.NET)中的一些奇怪行为。当我通过C++使用Winsock API并简单地调用closesocket()时,我发现窗口端发送FIN/ACK数据包,远端发送一个ACK数据包。这就是我所称的优雅结尾。但是,当用C#编程时,我没有看到我会称之为优雅的关闭。在C#中,我打开我的套接字,然后在关闭它时,我看到windows首先调用Socket.Shutdown()时发送一个FIN数据包只有。但是,无论如何,当我在C#中调用Socket.Close()时,都会发送一个RST数据包,并且连接立即被丢弃。这让我感到困惑,因为从我在线阅读的内容来看,TCP关闭过程应该是FIN/ACK - > ACK(实际上双方都是,但现在我只关心“我的”方面);即根本不应该有混合中的RST分组。从我读过的内容来看,显然,只有当接收者对连接状态不确定并且想要出去时才会发送RST数据包。如何防止.NET库关闭发送RST数据包
为什么这个RST数据包是在.NET中按计划关机发送的,而根本没有在从winsock API计划关机时发送?有没有办法阻止从.NET正常关机期间传输RST数据包?
如果重要,在两个代码路径中,我在调用相应的close()方法之前先读取套接字上的所有可用数据。
这很有趣。我必须看到当我实施睡眠时会发生什么。我不知道还会出现什么,因为我不认为这是可行的(如果它的作品)在这种情况发生的全部背景。我制作了框架程序来隔离行为。不过谢谢你,因为我没有想过在这里使用睡眠电话。 –