问题标签 [epoll]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
625 浏览

linux - 瓶颈问题的epoll架构问题

我正在研究网络编程(tcp)并且我有这个代码。这是我第一次使用 epoll,所以我不确定这个设计是否正确。此外,我正在使用一个线程池(5 个子线程),每当我从 epoll 读取数据时,我都会将其放入线程池的队列中。问题是在读取功能中我可以看到瓶颈问题。

在 read 函数中,它调用 ObserveSocket

它监视套接字,如果在一定时间内没有信号,则返回 0 以关闭套接字。我想我需要这段代码来检测意外的用户断开连接或数据损坏(客户端发送了 100 个字节,但服务器收到了 90 个字节,然后服务器将等待最后 10 个字节不会到达)。

如果你们能告诉我如何解决瓶颈问题和任何架构问题,我将不胜感激。

我还将寻找使用 epoll 并详细介绍异常处理的任何好的教程。

提前致谢。

编辑

在 recv() 函数内部,它只调用 read 函数,在我阅读之前,我调用 ObserveSocket

0 投票
4 回答
903 浏览

linux - 使用 epoll() 处理短读

假设客户端发送了 100 个字节的数据,但不知何故服务器只收到了 90 个字节。我该如何处理这种情况?如果服务器在 while 循环中调用“读取”函数检查接收到的总数据,那么服务器将永远等待包最后 10 个字节。

此外,客户端可能会在数据传输过程中断开连接。在这种情况下,服务器也将永远等待,直到它接收到所有不会到达的数据。

我正在使用 tcp,但在现实世界的网络环境中,可能会发生这种情况。提前致谢...

0 投票
1 回答
3139 浏览

linux - Does epoll(), do its job in O(1)?

Wikipedia says

unlike the older system calls, which operate at O(n), epoll operates in O(1) [2]).

http://en.wikipedia.org/wiki/Epoll

However, the source code at fs/eventpoll.c on Linux-2.6.38, seems it is implemented with an RB tree for searching, which has O(logN)

In fact, I couldn't see any man page saying the complexity of epoll() is O(1). Why is it known as O(1)?

0 投票
2 回答
2483 浏览

epoll - 使用边缘触发的 epoll,我应该循环发送吗?

我正在使用 epoll 编写媒体服务器。fds 都设置为非阻塞,我正在使用边缘触发事件。我知道对于 EPOLLIN,我需要循环读取 fd,直到返回 EAGAIN。但是写作呢?

当我想写数据时,我将数据排队并在 fd 上设置 EPOLLOUT|EPOLLIN|EPOLLET。当 EPOLLOUT 事件发生时,我一次性写入整个队列缓冲区:

如果 n > 0 && n < buf_len 我只是重置 EPOLLOUT 并返回。我没有看到循环发送的意义(我认为 epoll 的手册页暗示了这一点)。似乎 send 已经表明它已经接受了所有它可以并且如果立即调用将返回 EAGAIN。

在这里消除系统调用是最有效的途径吗?

0 投票
3 回答
4282 浏览

linux - 如何实现 epoll 超时?

我正在使用 epoll 进行网络编程。似乎工作正常。我想添加一个超时功能,所以如果客户端很长一段时间没有发送任何东西,那么它只会断开客户端。

我该怎么做呢?我知道我可以在 epoll_wait 中设置超时,但这不适用于单个套接字......

提前致谢...

0 投票
4 回答
10460 浏览

c++ - C++ 中的可扩展服务器框架

我正在寻找用 C++ 编写一个服务器应用程序,旨在同时处理数以万计的客户端。它应该在 Windows 和 Linux 下运行。我一直在寻找框架和库,并遇到了 Boost Asio,这似乎是一个非常成熟且广泛使用的替代方案。我只是在绞尽脑汁/线程池时遇到了麻烦,主要是因为有数百万个模板。我的背景主要是 C,所以不太习惯 Boost 似乎充满的模板混乱。我试图找人围绕 Boost Asio 开发一个相对较薄的包装器,它可以使用 strands、bind 等来处理线程/同步方面,但一直无法找到可以在我的预算范围内做到这一点的人(2 或300 美元)。

你们中的任何人都可以推荐任何其他可扩展的库以及 Boost Asio(例如,Windows 上的 IOCP 和 Linux 上的 epoll 等),或者我可能会找到有经验的 Boost 开发人员正在寻找较小的自由职业者的资源吗?

非常感谢您的任何帮助。

亲切的问候,

菲利普·班尼法尔

0 投票
3 回答
1969 浏览

multithreading - 在一个线程中执行 epoll_ctl 而另一个线程在 epoll_wait 中间

我是使用 epoll 进行 linux 服务器编程的新手。我有 2 个线程:Thread_Accept 和 Thread_epoll。前者是块接受循环,如果有新的连接到来,它会用 epoll_ctl() 添加新的 fd。后者是一个大的 epoll_wait() 循环。

现在我的问题是:如果 Thread_Accept 执行 epoll_ctl() 而 Thread_epoll 处于 epoll_wait 中间怎么办?会不会有什么副作用?

提前致谢。

问候,马丁

0 投票
1 回答
10257 浏览

c - epoll_wait 由于 EINTR 而失败,如何解决这个问题?

我的 epoll_wait 由于 EINTR 而失败。我的 gdb 跟踪显示了这一点:

这个字符串“启动计时器中的 epoll_wait 错误:测量将在整个执行期间”由我在 stderr 中打印。

我无法弄清楚如何解决这个 EINTR 以便 epoll_wait 可以工作。知道这个 EINTR 是如何由 GDB 跟踪生成的吗?

0 投票
1 回答
225 浏览

c++ - 如何解决此阻塞问题?

我有这段代码,发送功能有时会卡住。有人指出使用非阻塞 I/O。我正在使用 epoll,所以我认为将整个设计更改为非阻塞模式有点困难。有什么办法可以防止阻塞发送功能?

提前致谢..

0 投票
2 回答
13493 浏览

c - epoll 线程安全吗?

epoll中有两个功能:

  1. epoll_ctl
  2. epoll_wait

当我使用相同的 epoll_fd 时 它们是线程安全的吗?
如果一个线程调用 epoll_wait 而其他线程同时调用 epoll_ctl 会发生什么?