我正在为我的特殊开发需求定制一个框架,其中包括非常高性能的套接字管理。
为了在Linux上实现这一点,我需要调用来自<sys/socket.h>和<linux/eventpoll.h>的许多函数。
我还没有找到任何简单的解决方案,所以我不得不用C语言创建一个.so库文件,其中实际上包括上面提到的头文件,并创建了调用实际linux调用的导出函数,然后我不得不在C#中使用封送/互操作服务对这个.so库进行包装。
尽管它没有任何问题,但如果我能够跳过使用这个.so库文件,它实际上是连接C#运行时和Linux环境的桥梁,我会很高兴。
在没有桥接的情况下,是否有任何适当/更优雅的方法从调用Linux函数,因为我只是不能在C#中包含头文件?
谢谢你提前给我答案!
发布于 2019-03-27 07:30:38
同时,我发现它非常简单,因为所有所需的系统都是库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核心一起工作。
https://stackoverflow.com/questions/53606321
复制相似问题