我的libevent计时器会在另一个事件发生时立即停止......这是正常的吗?

时间:2015-10-17 08:04:52

标签: c++ timer libevent

目前我设置了两个活动:

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

在启动时,计时器工作,我可以等待我想要的时间,我的回调每秒都会被反复调用,就像预期一样。

然而,一旦我得到客户端连接,另一个甚至会发生,并且计时器停止工作。 libevent界面中是否存在已知错误,或者我是否可能滥用该库?

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

我添加了自己的C ++界面,因此显示这里的所有代码都非常大。它可以在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对象中删除了这两个连接并且它没有被击中(我知道我有一个日志,是的,记录器工作得很好。)

1 个答案:

答案 0 :(得分:2)

我的错!文档清楚地说明你应该使你的套接字无阻塞。一旦我这样做,它开始按预期工作。

自从我刚刚调用accept() ...

之后,我的套接字就被阻止了

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

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

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