c# - 在 dotnet (c#) 中使用 netlink 连接器?
问题描述
我正在编写一个 dotnet 核心应用程序,并希望使用 linux netlink 连接器提供的功能来侦听进程 fork 事件。
我不太确定这是否可以用 dotnet 编写,因为这是 C 中的 linux 内核代码。我应该使用 pinvoke 来调用 C 代码吗?事件将如何发送回我的 c# 处理程序?
解决方案
看起来您不能使用 dotnet 创建 netlink 连接器套接字。System.Net.Sockets 不支持底层协议族和地址族,并且尝试将类型转换为枚举类型也不起作用,套接字构造函数会抛出不受支持的地址族错误。
基本上,这行得通
#include <linux/connector.h>
#include <linux/netlink.h>
#include <sys/socket.h>
int main() {
int sock = socket(16, SOCK_DGRAM, 11);
return 0;
}
但这失败了
const UInt16 NETLINK_CONNECTOR = 11;
const UInt16 PF_NETLINK = 16;
Socket temp = new Socket((AddressFamily)PF_NETLINK, SocketType.Dgram, (ProtocolType)NETLINK_CONNECTOR);
扔一个
未处理的异常:System.Net.Sockets.SocketException:协议不支持地址族
这是跟踪此功能的 corefx 存储库上的 github 问题 - https://github.com/dotnet/corefx/issues/34015
推荐阅读
- java - JsonNode 比较不包括字段
- javascript - 在另一个 Promise 的回调中捕获 Promise 错误
- python - ValueError:检查输入时出错:预期 flatten_input 具有 3 个维度,但得到的数组形状为 (22, 12)
- php - 尝试使用 user_id Laravel 从用户模型中获取用户名
- javascript - javascript Timer 如何设置
- python - 通过在不同位置插入条件来创建条件字符串
- php - 如何将现有项目从 Laravel 5.3 升级到 Laravel 5.5?
- ethereum - Solidity 智能合约中找不到库函数
- android - 当从最近的应用程序中滑动应用程序时,前台服务被终止并且通知被删除
- javascript - 如何在 JavaScript 中创建大于 4 个字节的 UTF8 字符?