在 C# 中调用 Linux 套接字和 Epoll 函数

Calling Linux Socket and Epoll functions in C#

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

要在 Linux 上实现这一点,我需要从 <sys/socket.h><linux/eventpoll.h>.

调用大量函数

我还没有找到任何直接的解决方案,所以我不得不在 C 中制作一个 .so 库文件,它实际上包含上面提到的头文件,并创建调用实际 linux 调用,然后我不得不在 C# 中用 marshaling/interopservices.

围绕这个 .so 库制作一个包装器

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

是否有任何 proper/more 优雅的方式从 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 一起工作。