gpt4 book ai didi

c# - 在C#中调用Linux Socket和Epoll函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:30 31 4
gpt4 key购买 nike

我正在为我的特殊开发需求制作一个自定义框架,其中包括非常高性能的套接字管理。

要在 Linux 上实现这一点,我需要从 <sys/socket.h> 调用大量函数来自 <linux/eventpoll.h> .

我还没有找到任何直接的解决方案,所以我不得不做一个 .so C 中的库文件,实际上包括上面提到的头文件,并创建调用实际 linux 调用的导出函数,然后我不得不在 C# 中围绕这个 .so 制作一个包装器具有编码/互操作服务的库。

即使它工作没有任何问题,如果我可以跳过使用这个 .so 我会很高兴库文件,它实际上充当 C# 运行时和 Linux 环境之间的桥梁。

是否有任何适当/更优雅的方法从 C# 调用 Linux 函数而无需任何桥接,因为我不能在 C# 中包含头文件?

提前感谢您的回答!

最佳答案

同时我发现它非常简单,因为所有需要的系统调用都是库 libc 的导出函数,可以通过 DllImport 调用。

套接字函数可以通过以下方式访问:

    ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("libc", EntryPoint = "socket", SetLastError = true)]
internal static extern int socket(AddressFamily domain, SocketType type, ProtocolFamily protocol);

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("libc", EntryPoint = "bind", SetLastError = true)]
internal static extern int bind(int socket, SockAddr *address, uint address_len);

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("libc", EntryPoint = "listen", SetLastError = true)]
internal static extern int listen(int socket, int backlog);

等...

epoll 函数可以通过以下方式访问:

    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("libc", EntryPoint = "epoll_create", SetLastError = true)]
internal static extern int epoll_create(int size);

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("libc", EntryPoint = "epoll_create1", SetLastError = true)]
internal static extern int epoll_create1(int flags);

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("libc", EntryPoint = "epoll_ctl", SetLastError = true)]
internal static extern int epoll_ctl(int epoll, int op, int fd, EpollEvent *epollevent);

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("libc", EntryPoint = "epoll_wait", SetLastError = true)]
internal static extern int epoll_wait(int epoll, EpollEvent *epollevents, int maxevents, int timeout);

我已经测试过它们并在 Debian 下使用 Mono 工作,我相信它们也可以与 .Net Core 一起工作。

关于c# - 在C#中调用Linux Socket和Epoll函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606321/

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