gpt4 book ai didi

c# - 在 Linux 上从 .NET Core 手动调用 recvmsg 不会返回

转载 作者:太空狗 更新时间:2023-10-29 12:24:41 27 4
gpt4 key购买 nike

我正在为 .NET Core 编写 DBus 客户端 here .对于某些功能(例如 systemd 的抑制剂锁),需要通过 Unix 套接字连接接收文件描述符,而那些需要与控制相关的消息 recvmsg放入 struct msghdr . .NETs 套接字 API 不允许我访问该函数(或抽象),因此我必须手动调用它。

通往我的第一个 recvmsg 的代码的核心电话是here .当我针对 net462 编译它并在我的 Ubuntu 16.04 盒子或 Yocto 发行版(也使用 Mono)上通过 Mono 5.0.1 运行它时,一切都按预期工作。

当我针对 netcoreapp1.1/netstandard1.6 编译它并使用 dotnet 运行它时,问题就开始了: recvmsg调用只是不返回第一个 Hello反对org.freedesktop.DBus .

我可以用 dbus-monitor --system 看到方法调用已经离开我的应用程序并且 DBus 发送了方法返回以及 NameOwnerChangedNameAcquired信号。

一些注意事项:

  • 为了在 Ubuntu 上进行测试,我更改了 size_t iovec 中的字段和 msghdr来自 intlong实际上是 64 位的(尽管看起来结构所需的对齐使其无论如何都能工作)
  • 实际ConnectAsync对套接字的调用略有不同:对于 net462,我复制了 extension method来自 .NET Core 1.1
  • 要获得 native 套接字句柄,我可以使用 net462 上的 Handle 属性,但是 resort to reflecting the private field在 netcoreapp1.1 构建中。
  • 我还检查了 .NET Core 2.0 preview2 版本,它们的行为与 .NET Core 1.1 完全一样
  • 调用 Read在 socket 上而不是 recvmsg有效,虽然内部阅读只是映射到 recvmsg
  • 我比较了 Mono 和 .NET Core 之间 Socket 的公共(public)属性,没有明显差异:访问 ExclusiveAddressUse 在 Mono 上有效,但在 .NET Core 上抛出。
  • 有一点验证码here在接收线程开始工作之前。这会从套接字中进行一些基于 TPL 的读取。

我已经尝试遍历 CoreFX 套接字代码,但由于涉及的复杂性,这并不是很有趣。

缺少的链接是什么?

最佳答案

有两个连续的问题。

首先,我的 receive 方法成功吞下了一个异常,如果我运行 Connection 的 Dispose 方法而不是按 CTRL+C 退出程序,该异常可能是可见的。

System.TypeLoadException: Cannot marshal field 'control' of type 'msghdr': Unknown error.
at System.StubHelpers.ValueClassMarshaler.ConvertToNative(IntPtr dst, IntPtr src, IntPtr pMT, CleanupWorkList& pCleanupWorkList)
at Dbus.Connection.recvmsg(IntPtr sockfd, msghdr& buf, Int32 flags)
at Dbus.Connection.receive()

所以 recvmsg 从未真正被调用过。原因是 control 字段的类型是 int[]。我将其更改为 int* 并添加了另一个 fixed

不过,奇怪的是,Mono 能够使用 int[] 字段编码(marshal)此结构,而 .NET Core 则不能。

之后,真正调用了recvmsg,但立即返回了-1。不过,如果我只是使用 .NET 套接字 Read,一切都会正常进行。我选择直接通过 libc API 运行整个套接字处理,不再使用 .NET Core 套接字类型。现在,recvmsg 按预期工作。我假设基于 TPL 的 DBus 授权使套接字处于事件读取状态,而我的接收方法正在执行第二次读取,但该读取被“阻止”,但我尚未验证该假设。

关于c# - 在 Linux 上从 .NET Core 手动调用 recvmsg 不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573787/

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