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

标签 c# .net linux sockets interop

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

要在 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/

相关文章:

c# - 在 C# Winform 中获取货币汇率

c# - 在 C# 中从控制台应用程序内部调用一个方法到我的 Web 应用程序

.net - Azure 开发运营 : Make Nuget-Package with AssemblyVersion

php - 限制服务器中上传文件的大小

linux - 使用 Linux Kernel 会支持当前的程序吗?

c# - 如何从代码隐藏更改我的 css 文件中使用的颜色?

c# - 正确实现 IDisposable

c# - 我可以迭代 .NET4 MemoryCache 吗?

.net - 如何解决 "Could not find schema information for the element/attribute <xxx>"?

linux - Visual Studio 代码调试器错误 : "Could not find the task ' gcc build active file'