gpt4 book ai didi

c# - TcpClient.Close 不会关闭连接

转载 作者:行者123 更新时间:2023-11-30 19:32:45 25 4
gpt4 key购买 nike

我有一个应用程序使用 TcpClient 和 TcpListener 通过网络进行通信。但是,当我在客户端上调用 TcpClient.Close 以断开它与服务器的连接时,服务器根本没有反应。

现在,在您发表关于此问题与 this 重复的评论之前一,如何找到解决方案here ,当我说我已经找到并尝试过这些时,请相信我。它没有帮助。我还尝试了 TcpClient.CloseTcpClient.GetStream().Close()TcpClient.Dispose 的不同组合。什么都没用。

代码没有什么值得注意的,只是客户端中的一个 Disconnect 方法,它重置所有变量以供重用,并关闭所有网络资源。服务器有一个循环来检查 TcpClient.Connected 是否为真,如果为假,它应该跳出循环并终止线程。

有什么想法吗?

最佳答案

TcpClient.Connected 几乎应该被忽略。基本代表上次通信是否成功。来自 MSDN (强调我的):

Because the Connected property only reflects the state of the connection as of the most recent operation, you should attempt to send or receive a message to determine the current state. After the message send fails, this property no longer returns true. Note that this behavior is by design. You cannot reliably test the state of the connection because, in the time between the test and a send/receive, the connection could have been lost. Your code should assume the socket is connected, and gracefully handle failed transmissions.

如果您在客户端调用 Close(),则不会向服务器发送任何信息来告诉它它正在关闭,它实际上只是自行关闭,因此客户端无法使用它更多的。确定您是否仍处于连接状态的唯一可靠方法是尝试发送数据并处理故障。如果你愿意,你可以实现你自己的握手协议(protocol),当你调用 Close() 时,你会向服务器发送一个特殊的通知,提醒它这个事实,但仍然会有数据包永远不会到达服务器的时候.

关于c# - TcpClient.Close 不会关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4879341/

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