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

标签 c linux

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

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

我计划通过为每个端口创建 socket()、bind() 和 listen() 的 for 循环来执行此操作。

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

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

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

最佳答案

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

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

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

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

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

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

关于c - epoll - 轮询多个文件描述符(即套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19044304/

相关文章:

linux - select() 在 python2 和 python3 上的行为是否不同?

c - 使用c中的函数以相反的顺序打印数字

c - 关系比较结果C中for()循环的未使用错误

c++ - VS Code 不会构建具有多个 .ccp 源文件的 C++ 程序

linux - 搜索包含在 file1 中但在 file2 中找不到的字符串

linux - 将文件从多个目录复制到一个目标目录

java - __builtin_clz 的 Java 等价物是什么?

c++ - 如何从头文件中读取输入?

c - 是否有必要在 select 系统调用之间重置 fd_set?

c++ - FLTK桌面截图问题