首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中调用Linux套接字和Epoll函数

问在C#中调用Linux套接字和Epoll函数
EN

Stack Overflow用户
提问于 2018-12-04 05:37:18
回答 1查看 680关注 0票数 1

我正在为我的特殊开发需求定制一个框架,其中包括非常高性能的套接字管理。

为了在Linux上实现这一点,我需要调用来自<sys/socket.h>和<linux/eventpoll.h>的许多函数。

我还没有找到任何简单的解决方案,所以我不得不用C语言创建一个.so库文件,其中实际上包括上面提到的头文件,并创建了调用实际linux调用的导出函数,然后我不得不在C#中使用封送/互操作服务对这个.so库进行包装。

尽管它没有任何问题,但如果我能够跳过使用这个.so库文件,它实际上是连接C#运行时和Linux环境的桥梁,我会很高兴。

在没有桥接的情况下,是否有任何适当/更优雅的方法从调用Linux函数,因为我只是不能在C#中包含头文件?

谢谢你提前给我答案!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-27 07:30:38

同时,我发现它非常简单,因为所有所需的系统都是库libc的导出函数,可以通过DllImport调用。

可以通过以下方式访问套接字函数:

代码语言:javascript
复制
    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函数可通过以下方式访问:

代码语言:javascript
复制
    [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核心一起工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53606321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档