【问题标题】:C# Resource temporarily unavailable with blocking socket on dotnet core on linuxC# 资源暂时不可用,在 linux 上的 dotnet 核心上阻塞套接字
【发布时间】:2020-11-28 07:43:01
【问题描述】:

我有一些 c# 代码在 windows 上运行了很长时间,但在 dotnet 核心转换后在 linux 上运行时突然失败。

特定代码涉及手动打开套接字连接并通过将套接字临时设置为非阻塞来实现超时,以通过 Connect 方法,轮询套接字直到它连接,但也有一个超时退出路径。

当传递非阻塞连接方法时,会抛出一个异常,即“如果我是阻塞套接字,我会在这里阻塞”(技术上称为“EAGAIN”,字符串“资源暂时不可用”是绑)。我抓住了那个异常,如果它是“WouldBlock”,忽略异常并继续前进(轮询连接完成或超时发生)。在 linux 上,即使我收到此错误代码,我也会以某种方式获得“资源暂时可用”。

【问题讨论】:

    标签: linux sockets networking .net-core


    【解决方案1】:

    套接字的本地错误代码在每个操作系统上都不同,甚至在不同风格的 unix 上也不同。 当我们使用 MONO 进行跨平台时,它会自动将原生错误代码适配为 windows 错误代码,以便它们与 SocketError 枚举匹配。 Dotnet 核心不这样做。

    (现在)有三种方法可以获取 SocketException 的错误代码。

    • ErrorCode(直接指向 NativeErrorCode)
    • NativeErrorCode(返回操作系统特定的错误代码,仅匹配 Windows 上的 SocketError 枚举)
    • SocketErrorCode(将错误代码再次映射到 windows 错误代码,以便可以根据 SocketError 枚举检查它们)

    在检查 SocketException 错误代码时要跨平台,请使用 SocketException.SocketErrorCode 并将其与 SocketError 枚举进行比较。

    一篇好文章有更深入的信息:https://blog.jetbrains.com/dotnet/2020/04/27/socket-error-codes-depend-runtime-operating-system/

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 2017-11-29
      • 1970-01-01
      • 2018-01-15
      • 2020-04-16
      • 1970-01-01
      • 2013-06-03
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多