传输错误

Transport errors

我正在研究爬虫并尝试解决此异常的问题:

System.IO.IOException: 无法从传输连接读取数据: 现有连接被远程主机强行关闭。 ---> System.Net.Sockets.SocketException:远程主机在 System.Net.Sockets.NetworkStream.BeginRead(字节 [] 缓冲区、Int32 偏移量、Int32 大小、AsyncCallback 回调、对象状态)

强制关闭了现有连接

是在使用 wireshark 并查看网络日志后实施重试模式我得出结论,这些错误很可能是暂时的。

然而,这些异常现在确实困扰着我,我真的很想深入了解为什么会出现这些错误。任何人都可以提出一个好的策略和我可以使用的工具,或者你能想到为什么连接被强行关闭的原因吗?

谢谢

我的 50 美分:这是使用网络流从套接字读取数据时的正常行为。这不是用户错误,抛出的异常只是导致读取线程中的数据处理中断。相应地用 try/catch-handler 包裹起来。

您可以尝试使用 DebuggerNonUserCode 属性 (https://msdn.microsoft.com/de-de/library/system.diagnostics.debuggernonusercodeattribute%28v=vs.110%29.aspx) 在触发异常时抑制调试器警报。请注意,这也可能 "hide" 其他例外...

我在这里看到两个问题:

  • 为什么抛出异常?
  • 为什么连接被强行关闭?

为什么抛出异常?

这是您选择使用的传输实现的问题。显然,微软决定通过将错误包装在异常中并将其抛出堆栈来传达错误。可以在这里找到相应的源代码:http://referencesource.microsoft.com/#System/net/System/Net/Sockets/NetworkStream.cs,766
在源代码中,您还可以看到 InnerException 已设置并包含 errorCode 的本地化独立表示。
最重要的是,抛出这个异常并不意味着发生了任何异常,它可能只是因为连接断开而发生。

这让我们想到下一个问题:

为什么连接被强行关闭?

正如异常消息提示的那样,原因很可能是远程主机。因此,可能需要查看远程主机的实现才能弄清真相。 不过我怀疑,仅仅从例外情况来看,你不能排除在宿主之间的某个地方的原因(鲨鱼表现出对光缆的胃口)。
我建议进行以下实验:

  • 设置驻留在不同机器上的两台主机,让它们通过电缆连接。
  • 建立连接后,拔下电缆。

这不能反驳但至少证明了这种可能性。

但是,“在爬虫上工作”表明您可能会遇到各种不同的主机,并且可以预料其中的某些主机有时会因为您的原因而变得沉默寡言会在意想象。

编辑: 我记得当远程主机发送一个设置了 RST 标志的数据包时,在使用 TCP over IP 时捕获了这个异常。 Wireshark中显示RST Flag的值。