在Dotnet Core上,在Linux上使用阻塞套接字,出现C#“资源暂时不可用”的问题。

3

我有一些 C# 代码,在 Windows 上运行良好,但在转换为 .NET Core 后在 Linux 上突然出现错误。

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

当非阻塞连接方法传递异常时,会抛出一个“如果我是阻塞套接字,我将在此处阻塞”(技术上称为“EAGAIN”,与字符串“Resource temporarily unavailable” 绑定)。我捕获该异常并忽略“WouldBlock”的情况,并继续执行(轮询以完成连接或等待超时发生)。不知何故,在 Linux 上我收到了“Resource temporarily available” 的错误,即使我捕获了这个错误代码。

1个回答

2
套接字的本地错误代码在每个操作系统上都不同,甚至在不同版本的unix上也有所不同。当我们使用MONO进行跨平台开发时,它会自动将本地错误代码适应为Windows错误代码,以便与SocketError枚举匹配。但是Dotnet core不会这样做。
现在有三种方法可以获取SocketException的错误代码:
- ErrorCode(直接指向NativeErrorCode) - NativeErrorCode(返回OS特定的错误代码,仅在Windows上与SocketError枚举匹配) - SocketErrorCode(再次将错误代码映射到Windows错误代码,以便可以针对SocketError枚举进行检查)
要在检查SocketException错误代码时实现跨平台,请使用SocketException.SocketErrorCode并将其与SocketError枚举进行比较。
这篇文章提供了更深入的信息:https://blog.jetbrains.com/dotnet/2020/04/27/socket-error-codes-depend-runtime-operating-system/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接