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

时间:2013-09-27 06:43:34

标签: c linux

我阅读了手册页并通过了这个例子的用法:https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/,但是我无法想办法用epoll做我想做的事情,有人可以借给我一些帮助吗?

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

由于你想要创建的描述符的数量如此之大,你很可能需要更改一些内核参数,因为在一个进程中你可能会遇到一些开放描述符的限制。