- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为 .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 发送了方法返回以及 NameOwnerChanged
和 NameAcquired
信号。
一些注意事项:
size_t
iovec
中的字段和 msghdr
来自 int
至 long
实际上是 64 位的(尽管看起来结构所需的对齐使其无论如何都能工作)ConnectAsync
对套接字的调用略有不同:对于 net462,我复制了 extension method来自 .NET Core 1.1Read
在 socket 上而不是 recvmsg
有效,虽然内部阅读只是映射到 recvmsg
我已经尝试遍历 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/
iam 尝试使用 sendmsg、recvmsg 函数在两个进程之间传递文件描述符.. 我通过在unix域中创建套接字来做到这一点。 当我执行它时,我收到了recvmsg的操作不支持错误,它与send
我正在使用 recvmsg 和 sendmsg 通过异步 STREAM 套接字发送数据。要传输的数据量相当大,在 15 MB 到 30 MB 之间。 我不明白为什么数据到达时损坏了。发送消息和接收函数
我有套接字系列 PF_PACKET 类型 SOCK_RAW。通过 recvmsg 和 poll() 读取消息。我随机地和定期地收到 recvmsg 返回 EDEADLK。我尝试用下一个代码调试这个问题
本文整理了Java中org.zeromq.ZMsg.recvMsg()方法的一些代码示例,展示了ZMsg.recvMsg()的具体用法。这些代码示例主要来源于Github/Stackoverflow/
自 recvmsg()在 asyncio 中丢失模块,我试图以与 BaseEventLoop.sock_recv() 完全相同的方式重新实现它已实现: import asyncio, socket d
我正在Linux中打开RAW套接字并读取所有消息。 recvmsg(mysock, &msg, 0); 我遍历该msg缓冲区上的所有cmsg,但只有一个。 for (c = CMSG_FIRS
如果C套接字的recvmsg()具有队列,我如何找出队列中积压了多少项? 我的问题是,从recvmsg()接收到某些内容后,代码的速度有时会比发送到recvmsg()的数据速率慢,这在逻辑上会导致排队
我在接收 UDP 数据包时遇到问题。我的环境在 ARMv7 上运行 Android 2.1。对于 C 套接字编程,我使用 recvmsg 从内核接收数据包,但偶尔会出现一些数据包丢失事件。发送方和接收
我正在开发一个在两个进程之间进行IPC调用的程序。我使用socketpair创建两个套接字fd: int fds[2] = {-1,-1}; if (socketpair(AF_LOCAL, SOCK
在这个问题上有点困惑 :-)。我有一些代码在 Ubuntu 10.04 上运行,它使用 recvmsg 调用来接收音频 UDP 数据包。这部分是一个更大的 SIP 客户端的一部分,我一直在通过网络使用
我正在编写一个程序,使用 sendmsg 在两个进程之间传递文件描述符和 recvmsg通过域套接字。对于发送文件描述符,附加数据包含在 msghdr.msg_iov 中和 msghdr.msg_io
我有一个使用 pthreads 的小 Unix 守护进程。一个线程循环运行,使用 recvmsg 读取网络数据包。当守护进程收到信号时,会设置一个标志,告诉所有线程跳出循环并退出。然而,“监听”线程从
我正在编写一个 CAN 记录器程序。我记录数据的方式类似于 candump -tool 在调用 candump 时执行此操作喜欢 candump any : https://github.com/li
我正在使用 Linux 机器,并且正在发送 UDP 数据包。 我想为传输的数据包获取 NIC 上的硬件时间戳。我看过其他帖子并设置了适当的标志。 int flag = SOF_TIMESTAMPING
在unix系统上使用TCP套接字,python似乎完全忽略了我的ancbufsize。 data, ancdata, msg_flags, address = sock.recvmsg(1, sock
我必须使用 recvfrom() 从多个接口(interface)接收(在编译时未知,并且还需要保留消息的确切顺序,而不是使用单独的系统调用从每个接口(interface)接收反过来),但我还需要访问
我在 Linux 中有一个使用 C 的应用程序,其中我创建了一个套接字来接收 IPv6 UDP 数据包。 为了接收数据包,我使用了 recvmsg(),因为我需要检索 ifindex,我可以使用选项
在使用 recvmsg 时,我使用 MSG_TRUNC 和 MSG_PEEK,如下所示: msgLen = recvmsg(fd, &hdr, MSG_PEEK | MSG_TRUNC) 这给出了为下
我正在使用 UDP 的 Haskell 中编写一个隧道应用程序。为了让它“正确”,我想适本地设置 MTU。但是,我找不到任何简单的方法来做到这一点。 haskell 中是否有一个 recvmsg()
我在 CentOS 6.5 上,内核版本为 kernel-2.6.32-431.el6。 我试图找到 recvmmsg() 的实现,希望我没有看错源代码 ~/rpmbuild/BUILD/kernel
我是一名优秀的程序员,十分优秀!