Между тем я понял, что это очень просто, так как все необходимые системные вызовы являются экспортированными функциями библиотеки 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.