在 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 一起工作。
我正在为我的特殊开发需求制作一个自定义框架,其中包括非常高性能的套接字管理。
要在 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 一起工作。