【发布时间】:2013-09-17 18:33:22
【问题描述】:
我编写了许多通过 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);
}
}
【问题讨论】:
-
在 TCP 中,进程通常不能永远挂起... TCP 发送
alive?信号以检查其他节点是否仍然处于活动状态。 -
...因此我很困惑。
-
你考虑过
TcpClient.LingerState吗?你如何使用 TCP? Socket 编程还是一些专门的库? -
有一个循环,您在程序内部接收数据的地方似乎挂起。发布该代码。