gpt4 book ai didi

c# - 为什么零长度的 Send() 在错误的 TCP 套接字连接上不会失败?

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

我正在尝试在 .NET 中编写一个非常简单的 TCP 服务器,它只处理一个客户端的一个连接,我的挑战是检测半开连接。

根据这个无处不在的 MSDN 代码...

// This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking;
try
{
byte [] tmp = new byte[1];

client.Blocking = false;
client.Send(tmp, 0, 0);
Console.WriteLine("Connected!");
}
catch (SocketException e)
{
// 10035 == WSAEWOULDBLOCK
if (e.NativeErrorCode.Equals(10035))
Console.WriteLine("Still Connected, but the Send would block");
else
{
Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
}
}
finally
{
client.Blocking = blockingState;
}

...我认为这样做的目的是发现任何现实世界的连接问题(例如远程客户端的网络电缆被拔掉)并抛出所需的异常。

然而,我也明白发出 Send() 只会导致数据被放入套接字的底层发送缓冲区...所以显然它不会因为一个问题而失败 客户端。

我读到您需要执行后续 Receive() 才能真正获得零长度发送测试的结果。但是,我的服务器目前正在使用连续的 BeginReceive 方法,在这种方法中,一旦我实际接收到数据并对其进行处理,我就会启动 BeginSend(),然后发出另一个 BeginReceive()。

换句话说,在执行“MSDN 测试”时,我已经有一个有效的挂起接收。 不会以某种方式感知到缺少 ACK 并发出错误信号吗?

谢谢

最佳答案

软件方面证明连接仍然存在的方法是向另一端发送消息,然后等待超时以等待响应。不仅仅是连接建立了,而且对方正常响应。

与证明物理连接的方式并没有什么不同,一对发送 5v,看看另一对是否返回大约 5v。

Google TCP/IP Heartbeat 以获得更多帮助。

关于c# - 为什么零长度的 Send() 在错误的 TCP 套接字连接上不会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23429543/

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