远程断开连接时不发送FIN

时间:2015-04-28 09:55:40

标签: c# .net sockets tcpclient

另一方在一段时间不活动后设置了关闭连接。它会发送FIN, ACK,但我的程序仅基于this Wikipedia post发送ACK而不是FIN。基本上我遇到与this问题相同的问题 我不想要尝试发送数据并检查错误是否发生的解决方案我只是好奇是否可以从C#自动优雅地关闭连接作为对方FIN, ACK的回复。
This回答声称它指的是回答,但该人在指出的页面上没有回答。

修改
一些补充信息:
我通过TcpClient类作为客户端连接,如下所示:

var client = new TcpClient();
client.Connect(new IPAddress(new byte[] { 192, 168, 1, 112 }), 60000);

使用RS485 / LAN转换器创建连接。该转换器具有参数,该参数定义了关闭连接的不活动时间。可以设置此参数。我无法影响到这一点 连接(没有数据,超时设置为30秒,客户端在192.168.1.13上,转换器在192.168.1.14上)如下所示:

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而我没有通信就等了几分钟。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

从概念上讲,TCP连接是两个半双工半连接,每个方向一个。你似乎正在做的是关闭一个半连接而不是另一个连接 - 就TCP而言,这完全没问题。

要完全关闭连接,您需要通过在客户端和服务器上调用closeshutdown来从双方发送FIN。