C# 远程断开连接时不发送FIN

C# 远程断开连接时不发送FIN,c#,.net,sockets,tcpclient,C#,.net,Sockets,Tcpclient,另一方在一段时间不活动后设置了关闭连接。它发送FIN,ACK,但我的程序只发送ACK,不发送FIN,这是它应该基于的。基本上,我的问题与上述问题相同。 我不想要尝试发送数据并检查是否发生错误的解决方案,我只是好奇是否有可能自动优雅地从C#关闭连接,作为从另一端回复FIN,ACK。 答案声称它指向了答案,但在指向的页面上没有该人的答案 编辑: 一些新增信息: 我通过TcpClient类作为客户端进行连接,如下所示: var client = new TcpClient(); client.Conn

另一方在一段时间不活动后设置了关闭连接。它发送
FIN,ACK
,但我的程序只发送
ACK
,不发送
FIN
,这是它应该基于的。基本上,我的问题与上述问题相同。
我不想要尝试发送数据并检查是否发生错误的解决方案,我只是好奇是否有可能自动优雅地从C#关闭连接,作为从另一端回复
FIN,ACK

答案声称它指向了答案,但在指向的页面上没有该人的答案

编辑
一些新增信息:
我通过
TcpClient
类作为客户端进行连接,如下所示:

var client = new TcpClient();
client.Connect(new IPAddress(new byte[] { 192, 168, 1, 112 }), 60000);
11:13:06   192.168.1.13   192.168.1.14   SYN
11:13:06   192.168.1.14   192.168.1.13   SYN, ACK
11:13:06   192.168.1.13   192.168.1.14   ACK
11:13:36   192.168.1.14   192.168.1.13   FIN, ACK
11:13:36   192.168.1.13   192.168.1.14   ACK
通过RS485/LAN转换器建立连接。此转换器具有一个参数,该参数定义它在多长时间不活动后关闭连接。该参数可以设置也可以不设置。我不能影响这一点。
连接(没有数据,超时设置为30秒,客户端在192.168.1.13,转换器在192.168.1.14)如下所示:

var client = new TcpClient();
client.Connect(new IPAddress(new byte[] { 192, 168, 1, 112 }), 60000);
11:13:06   192.168.1.13   192.168.1.14   SYN
11:13:06   192.168.1.14   192.168.1.13   SYN, ACK
11:13:06   192.168.1.13   192.168.1.14   ACK
11:13:36   192.168.1.14   192.168.1.13   FIN, ACK
11:13:36   192.168.1.13   192.168.1.14   ACK

如您所见,客户端没有发送
FIN
,我等待了几分钟没有通信。

您是客户端还是服务器?断开连接应始终从客户端应用程序开始,而不是从服务器开始。当连接的两端试图同时断开连接时,TCP存在已知问题。由于竞争条件的原因,您可能会得到半开/半关的插座。为了防止发生这种情况,建议您启动与客户端的断开连接。通常,我建议将一条消息从客户端应用程序发送到服务器应用程序以停止。客户端等待并确认停止已完成的消息。然后,客户端关闭套接字并终止应用程序。服务器等待套接字关闭的事件。然后服务器关闭应用程序

从概念上讲,TCP连接是两个半双工半连接,每个方向一个。您所做的似乎是关闭连接的一半,而不是另一半——就TCP而言,这是非常好的


为了完全关闭连接,您需要通过在客户端和服务器上调用
close
shutdown
从两侧发送FIN。我们是想猜测您的代码是做什么的吗?ACK和FIN是TCP协议的一部分,但在使用C#和Socket时,您通常不会在软件级别担心或考虑到这一点。所有这些都被隐藏,并且被认为比您在套接字级别进行的调用级别低。@spender我认为这与我的代码无关,因为我不在乎在代码中发送
FIN
ACK
,但我还是编辑了我的问题。@RenniePet我同意你的看法。我真的希望我不想再关心C#中的这些东西了,但看起来这里有些东西不正常工作。。。或者我只是不知道如何使用它…我编辑了我的问题。我的应用程序是客户端,但我确信它不希望与服务器同时断开连接。如果不希望服务器关闭,请使用KeppAlive方法,该方法将每5秒发送一个空数据包。是的,我知道。我只是想知道当我不必显式地使用
close
shutdown
时是否有一些设置,但是当另一侧的
FIN
到达时,套接字会自动关闭,因为我无法通知另一方关闭连接。通过
read
返回文件结束指示通知您另一方关闭连接。如果您是指
NetworkStream.read
,我认为这不是很好的解决方案,因为如果没有要读取的数据,而另一方仍处于连接状态,则基本上会阻塞线程,直到另一方关闭其连接。“如果远程主机关闭连接[…],则读取方法立即完成并返回零字节”是的,这是真的,我验证了这一点,但正如我写的那样,如果没有数据要读取,并且连接仍然处于活动状态,
read
方法会阻止我的线程,因此基本上,只有当我知道另一端已经断开连接时,我才能以这种方式检查连接,否则它会阻止我的线程执行其他代码。