我正在做一些测试试图隔离库中的一些奇怪的行为(.NET).当我通过C++使用Winsock API并简单地调用closesocket()时,我看到windows端发送FIN/ACK数据包,远程端发回ACK数据包.这就是我称之为优雅的结果.但是,当用C#编程时,我没有看到我称之为优雅的结果.
在C#中,我打开我的套接字然后,当关闭它时,我看到Windows发送FIN数据包只有在第一次调用Socket.Shutdown()时.但是,无论如何,当我在C#中调用Socket.Close()时,会发送一个RST数据包并立即删除连接.这让我感到困惑,因为从我在线阅读的内容来看,TCP关闭过程应该是FIN/ACK - > ACK(实际上来自双方,但是现在,我只关心"我的"方面); 即,混合中根本不应该有RST数据包.从我所看到的,显然,只有当接收器不确定连接状态并且想要输出时才发送RST数据包.
为什么这个RST数据包是在.NET中的计划关闭时发送的,而不是在winsock API的计划关闭中发送的?有没有办法阻止在从.NET正常关闭期间传输RST数据包?
如果它很重要,在两个代码路径中,我在调用相应的close()方法之前读取套接字上的所有可用数据.