gpt4 book ai didi

linux - C# 资源暂时不可用,在 linux 上的 dotnet core 上阻塞套接字

转载 作者:行者123 更新时间:2023-12-05 05:00:02 24 4
gpt4 key购买 nike

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

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

当传递非阻塞连接方法时,会抛出一个异常,表示“如果我是一个阻塞套接字,我会阻塞在这里”(技术上称为“EAGAIN”,字符串“Resource temporary unavailable”是系)。我捕获到该异常,如果它是“WouldBlock”,则忽略该异常并继续(轮询连接完成或超时发生)。在 Linux 上,即使我捕获了此错误代码,我仍以某种方式获得“资源暂时可用”。

最佳答案

套接字的 native 错误代码在每个操作系统上都不同,甚至在不同风格的 unix 上也不同。当我们使用 MONO 进行跨平台时,它会自动将 native 错误代码适配为 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/

关于linux - C# 资源暂时不可用,在 linux 上的 dotnet core 上阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63310779/

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