gpt4 book ai didi

.net - Socket.SendAsync 未检测到无效的 TCP 连接

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

我遇到 Socket.SendAsync 方法未检测到死 TCP 连接的问题。在我的客户端/服务器应用程序中,服务器定期向连接的客户端发送心跳。

我遇到的问题是,即使客户端可能已死,来自 SendAsync 方法的回调指示“SocketError.Success”并且 Socket.Connected 属性为真,即使客户端不再“活着” ”。因此,对于服务器来说,心跳数据似乎已正确发送并且客户端仍然存在。

我每次都看到这个问题,客户端 PC 要么进入休眠/休眠状态,要么例如当客户端在 VMWare 实例中运行并且该实例被挂起时。当客户端关闭应用程序、从任务管理器中将其终止等时,我没有看到此问题。

    internal void InternalSendAsync(ByteDataChunk chunk)
{
asyncSendArgs.SetBuffer(chunk.Buffer, 0, chunk.Offset);
asyncSendArgs.UserToken = chunk;
Socket.SendAsync(asyncSendArgs);
}

private void SendCompleted(object sender, SocketAsyncEventArgs args)
{
if (args.SocketError != SocketError.Success || !Socket.Connected)
{
InternalDisconnect(args.SocketError);
return;
}

// all is good & do some other stuff
}

任何人都知道这里发生了什么,为什么 SendCompleted 方法不返回 SocketError,即使客户端已经死了很久(我之前已经让服务器运行了多个小时并且从未检测到死套接字)?

谢谢,

汤姆

最佳答案

来自 MSDN :

Note that the successful completion of the SendAsync method does not indicate that the data was successfully delivered.

IMO,关于网络的最困难的部分之一是您不能确定客户端曾经获得数据。如果您正在实现心跳系统,您应该让客户端回显心跳,证明它仍然存在。

当您挂起进程或使计算机休眠时,我认为套接字不会像关闭正在运行的机器时那样关闭。

关于.net - Socket.SendAsync 未检测到无效的 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3516126/

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