我曾写过一些通过TCP通信的小程序。由于其中一个程序关闭了其网络连接,另一个端点无法“注意到”已经断开连接,我遇到了无穷无尽的问题而导致系统崩溃。
我本来期望在关闭后进行I/O操作会抛出某种I/O异常,但实际上程序似乎只是“挂起”,永远等待另一端回复。显然,如果连接关闭,回复永远不会到来。(即使您将其放置约二十分钟,它也不会超时。)
有没有办法可以“强制”远程端“看到”我已经关闭了网络连接?
更新:这里是一些代码...
我本来期望在关闭后进行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);
}
}
TcpClient.LingerState
吗?你是如何使用TCP的?是通过Socket编程还是一些专用库? - Willem Van Onsem