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

时间:2018-12-04 05:37:18

标签: c# .net linux sockets interop

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

要在 Linux 上实现此目的,我需要从<sys/socket.h><linux/eventpoll.h>调用众多函数。

我还没有找到任何简单的解决方案,因此我不得不用C语言制作一个.so库文件,该文件实际上包括上述头文件,并创建了调用实际linux调用的导出函数,然后我必须用封送处理/互操作服务在此C .so库中用C#包装。

即使它可以正常工作,但如果我可以跳过使用这个.so库文件,我很高兴,该文件实际上是C#运行时和Linux环境之间的桥梁。

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

谢谢你的回答!

1 个答案:

答案 0 :(得分:0)

与此同时,我发现它非常简单,因为所有必需的系统调用都是库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);

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