我编写了许多通过 TCP 进行通信的小程序。我在系统挂起方面遇到了无穷无尽的问题,因为一个程序已关闭其网络连接,而另一个端点不知何故没有注意到它现在已断开连接。
我期待在已关闭的 TCP 连接上执行 I/O 以引发某种 I/O 异常,但程序似乎只是挂起,永远等待另一个端点回复。显然,如果连接关闭,则该回复永远不会到来。(如果您将其放置二十分钟,它甚至似乎都不会超时。)
有什么方法可以强制远程端“看到”我已经关闭了网络连接?
更新:这是一些代码...
public sealed class Client
{
public void Connect(IPAddress target)
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipAddress, 1177);
_stream = new NetworkStream(socket);
}
public void Disconnect()
{
_stream.Close();
}
}
public sealed class Server
{
public void Listen()
{
var listener = new TcpListener(IPAddress.Any, 1177);
listener.Start();
var socket = listener.AcceptSocket();
_stream = new NetworkStream(socket);
...
}
public void Disconnect()
{
socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(false);
}
}