我正在为我的特殊开发需求定制一个框架,其中包括非常高性能的套接字管理。
要在 Linux 上实现此目的,我需要从<sys/socket.h>
和<linux/eventpoll.h>
调用众多函数。
我还没有找到任何简单的解决方案,因此我不得不用C语言制作一个.so
库文件,该文件实际上包括上述头文件,并创建了调用实际linux调用的导出函数,然后我必须用封送处理/互操作服务在此C .so
库中用C#包装。
即使它可以正常工作,但如果我可以跳过使用这个.so
库文件,我很高兴,该文件实际上是C#运行时和Linux环境之间的桥梁。
因为我无法在C#中包含头文件,所以是否有任何适当/更优雅的方法可以从C#调用Linux功能 而没有任何桥接?
谢谢你的回答!
答案 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一起使用。