epoll - 轮询多个文件描述符(即套接字)

Posted

技术标签:

【中文标题】epoll - 轮询多个文件描述符(即套接字)【英文标题】:epoll - polling multiple file descriptors (that are sockets) 【发布时间】:2013-10-03 08:52:38 【问题描述】:

我阅读了手册页并浏览了这个示例以供使用:https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/,但我无法找到一种方法来使用 epoll 来做我想做的事情,有人可以帮我吗?

基本上我正在编写一个 netcat 类型的实用程序来更好地学习 C/网络。我创建了一个可以在一个端口上侦听和连接的基本服务器/客户端。现在我想扩展服务器方面来监听一个端口范围。

我计划通过 for 循环为每个端口创建 socket()、bind() 和 listen()。

由于端口范围最大可达 65k,因此我需要在收到连接请求时轮询它们并接受()。

取消链接使用 poll 或 epoll 处理一个端口上的多个连接的典型 C 服务器,这是数千个潜在端口之一上的一个连接。我无法从示例中完全了解如何对套接字进行 epoll 以及在请求连接时接受它并取消绑定/停止侦听/轮询。

有没有人有任何示例解释/代码让我开始?

【问题讨论】:

【参考方案1】:

1 - 创建所有服务器套接字

2 - 它们的文件描述符将包含在一个范围内,例如 [4, 199]

3 - 在循环中将它们全部添加到 epoll 描述符中。

然后在正常的 epoll 循环中,如果带有事件的描述符在 [4,199] 范围内或实际范围内,那么你知道它是一个服务器套接字,你需要接受它,否则做任何事情你用你的连接描述符做。

另一种方法是创建 2 个 epoll 描述符,一个仅用于服务器套接字,另一个仅用于连接的描述符。这样做的好处是你需要对它们都使用 epoll !所以我不建议这样做。

由于您要创建的描述符数量如此之多,您很可能需要更改一些内核参数,因为您可能会在一个进程中有这么多打开的描述符时遇到一些限制。

【讨论】:

那么像我展示的那样使用循环创建套接字?你能把数组传给epoll吗? 不,你必须在循环中一个一个地添加它们

以上是关于epoll - 轮询多个文件描述符(即套接字)的主要内容,如果未能解决你的问题,请参考以下文章

Epoll用法及读写触发条件

select与epoll

epoll 返回 0 个事件

I/O多路复用-EPOLL探索

selectpoll和epoll

IO多路复用