与网络的物理断开连接和间歇性套接字错误 10057

Physical disconnection from network and intermittent socket error 10057

我的一个客户有一个 Windows 应用程序,其中两台机器之间存在网络连接。该系统应该处理连接丢失的情况。它通过在客户端位置保留一个计数器来做到这一点,每次从服务器接收到数据时都会重置该计数器。如果计数器达到 60 秒(即我们在 60 秒内没有收到服务器的消息),它会执行一些预期的操作来应对连接丢失。

然而,客户遇到了一个问题,有时连接会丢失,但客户端没有执行预期的操作。经调查,这似乎是一个间歇性问题,由客户端到服务器的套接字有时会在连接丢失时引发错误 10057 (WSAENOTCONN / "Socket is not connected")。由于客户端在收到套接字错误时的行为不同,因此客户在收到此套接字错误时不会获得所需的行为。这对我来说并不难解决,但我对不同的行为有点困惑。

为了重现该问题,我将网络电缆从我的服务器计算机背面拔出。大多数时候,对客户端的影响是我们不会通过套接字获取任何数据,也不会收到错误。然而,有时会出现错误 10057。任何人都可以阐明为什么会出现这种不一致吗?客户端套接字是非阻塞 STREAM 套接字。

我希望只有在尝试发送内容时才会出现错误。那时 TCP 连接会发现它无法到达另一个端点。这将花费可变的时间来发现故障,具体取决于网络往返时间。可能有一个 "keep alive" 选项,它强制套接字定期发送一些东西来检测故障,即使应用程序处于空闲状态也是如此。

WSAENOTCONN 是您的应用程序中的错误。这不是连接断开的结果。失去连接的结果是 WSAECONNRESET. 您的代码必须得到 WSAECONNRESET, 然后继续使用连接,就好像它仍然有效一样。 然后你得到WSAENOTCONN.