gpt4 book ai didi

c# - 检测关闭的网络连接

转载 作者:可可西里 更新时间:2023-11-01 02:32:44 25 4
gpt4 key购买 nike

我编写了一些通过 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);
}
}

最佳答案

当应用程序以正确的方式关闭套接字时,它会发送一条包含 0 字节的消息。在某些情况下,您可能会收到一个 SocketException 指示发生了错误。第三种情况,对方不再连接(比如拔掉网线),双方之间没有任何通信。

如果发生最后一件事,您将不得不向套接字写入数据以检测您是否无法再连接到远程方。这就是保持事件机制被发明的原因 - 他们经常检查他们是否仍然可以与另一方通信。

看到您现在发布的代码:当使用 NetworkStream 时,对其的 Read 操作将返回 0(字节)值,表示客户端已关闭连接.

documentation是提到两者

"If no data is available for reading, the Read method returns 0."

"If the remote host shuts down the connection, and all available data has been received, the Read method completes immediately and return zero bytes."

在同一段中。实际上,如果在连接打开时没有数据可供读取,NetworkStream 就会阻塞。

关于c# - 检测关闭的网络连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18846505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com