c++ - 一旦另一个事件发生,我的 libevent 计时器就会停止……这正常吗?

标签 c++ timer libevent

目前我设置了两个事件:

  • 监听来自客户端的新连接(我是服务器)
  • 每秒运行一些代码以完成各种后台工作的计时器

在启动时,计时器会工作,我可以等待任意长的时间,并且我的回调会按照预期每秒一次又一次地被调用。

但是,一旦我获得一个客户端连接,另一个甚至会发生,并且计时器以某种方式停止工作。 libevent 接口(interface)中是否存在已知错误,或者我是否可能滥用该库?

我在 Ubuntu 14.04 下使用 libevent 版本 libevent-2.0-5:amd64。

我添加了自己的 C++ 接口(interface),因此在这里显示所有代码会非常大。它可以在 SourceForge.net 上的项目中浏览:

https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapwebsites/lib/snap_communicator.h https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapwebsites/lib/snap_communicator.cpp

用法很简单,但又很庞大,完整的实现可以在这里找到:

https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapwebsites/lib/snapwebsites.cpp

重要部分如下所示:

g_connection = new connection_t;
g_connection->f_communicator.reset(new snap_communicator(priority));

g_connection->f_listener.reset(new listener_impl(this, host[0].toUtf8().data(), p, max_pending_connections, true, false));
g_connection->f_listener->set_name("server listener");
g_connection->f_communicator->add_connection(g_connection->f_listener);

g_connection->f_temporary_timer.reset(new temporary_timer(this));
g_connection->f_temporary_timer->set_name("server timer");
g_connection->f_communicator->add_connection(g_connection->f_temporary_timer);

g_connection->f_communicator->run();

正如我们所看到的,我添加了这两个“连接”并且计时器工作正常,直到监听器发生。只有一个地方我从 libevent 对象中删除了这两个连接并且它没有被命中(我知道我有一个日志,是的,记录器工作得很好。)

最佳答案

我错了!文档清楚地表明你应该让你的套接字成为非阻塞的。一旦我这样做了,它就开始按预期工作。

我的套接字之前一直阻塞,因为我只是调用 accept()...

现在我真的不明白为什么图书馆有这样的限制,但这就是这个问题的解决方案。

我为监听器添加了以下代码:

if(get_socket() != -1)
{
    // libevent does not like blocking sockets...
    int optval(1);
    ioctl(get_socket(), FIONBIO, &optval);
}

关于c++ - 一旦另一个事件发生,我的 libevent 计时器就会停止……这正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33184319/

相关文章:

安卓 : Can't it possible to control 2+ activities data loading through a single timer

timer - Wowza 服务器模块 - 视频聊天的定时器/倒计时

c - 使用cygwin在windows下构建libevent?

epoll - libevent 和 epoll,哪个更有效?

c++ - 部分和显式模板特化的奇怪错误

c++ - 如何在 C++ 中存储数据并使数据可搜索?

javascript - 在javascript中刷新页面后继续时钟时间

c - libevent:从缓冲区读取所有字节

c++ - 每次制作都会创建预编译头?

c++ - 一个类的构造函数,为其他类类型转换..将调用什么函数?