我正在编写一个小型 (C#) 客户端应用程序,该应用程序使用 TCP/IP 连接将数据发送到远程服务器。我正在使用标准 .Net TcpClient 对象,并且希望在客户端保持连接打开状态,因为我定期向服务器提交数据包。但是,服务器可能会关闭连接,在这种情况下,我需要知道在发送下一个数据包之前重新连接。
使用 Wireshark,当服务器终止连接时,我(仅)可以看到以下对话:
server >>> FIN, ACK
ACK <<< client
我做什么not看到我的客户端用它自己的 FIN 进行响应,以完成连接关闭。结果是我的客户端程序在发送下一个数据包后才发现连接断开了。
有什么方法可以设置 TcpClient 或其底层 Socket 以完成断开连接,并提供一些反馈,以便我的客户端代码知道在发送下一个数据包之前重新连接?
Added回应以下评论:
我的发送代码非常简单 - 维护 TcpClient 和 NetworkStream 成员变量的对象有一个包含(本质上)以下内容的成员函数:
bool sent = false;
byte[] buffer = Encoding.UTF8.GetBytes(dataString);
while (!sent)
{
try
{
m_outStream.Write(buffer, 0, buffer.Length);
sent = true;
}
catch (Exception ex)
{
if (m_outStream != null) { m_outStream.Dispose(); }
m_client = new TcpClient(AddressFamily.InterNetwork);
m_client.Connect(ipAddress, ipPort);
m_outStream = m_client.GetStream();
}
}
当 m_client 和 m_outStream 初始化后,每次只执行一次。然后使用 Wireshark 我可以看到服务器发送带有标志的数据包FIN, ACK
客户回应ACK
.
下次我调用我的函数时,数据将被发送出去PSH, ACK
,服务器响应RST, ACK
但不读取传入的数据。客户没有提出任何异常。
然后我第二次调用我的函数,并引发异常,导致连接重新启动。