Вызов функций Linux Socket и Epoll в C # - PullRequest
0 голосов
/ 04 декабря 2018

Я делаю специальную платформу для своих особых нужд разработки, которая включает в себя очень высокопроизводительное управление сокетами.

Чтобы добиться этого на Linux , мне нужно вызвать множество функций из <sys/socket.h> и <linux/eventpoll.h>.

Я пока не нашел простого решения, поэтому мне пришлось создать библиотечный файл .so на C, который на самом деле включает в себя файлы заголовков, упомянутые выше, и создать экспортированныйфункции, которые вызывают реальные вызовы Linux, тогда мне пришлось создать оболочку в C # вокруг этой .so библиотеки с маршалингом / interopservices.

Даже если это работает без проблем, я был бы рад, если бы яможно просто пропустить, используя этот .so библиотечный файл, который на самом деле работает как мост между средой выполнения C # и средой Linux.

Есть ли какой-нибудь правильный / более элегантный способ вызова функций Linux из C # без каких-либо переходов, так как я просто не могу включить заголовочные файлы в C #?

Спасибо за ответ заранее!

1 Ответ

0 голосов
/ 27 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...