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