一旦发生另一个事件,我的 libevent 计时器就会停止……这正常吗?
Posted
技术标签:
【中文标题】一旦发生另一个事件,我的 libevent 计时器就会停止……这正常吗?【英文标题】:My libevent timer stops as soon as another event occurs... is that normal? 【发布时间】:2015-10-17 08:04:52 【问题描述】:目前我设置了两个事件:
监听来自客户端的新连接(我是服务器) 每秒运行一次代码以执行各种后台工作的计时器在启动时,计时器工作,我可以等待,只要我愿意,我的回调就会像预期的那样每秒被一遍又一遍地调用。
但是,一旦我获得客户端连接,另一个甚至会发生,并且计时器以某种方式停止工作。 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】:我的错!该文档清楚地表明您应该使您的套接字成为非阻塞的。一旦我这样做了,它就开始按预期工作了。
我的套接字之前被阻塞了,因为我只是在调用accept()
...
现在我真的不明白为什么图书馆有这样的限制,但这就是这个问题的解决方案。
我为监听器添加了以下代码:
if(get_socket() != -1)
// libevent does not like blocking sockets...
int optval(1);
ioctl(get_socket(), FIONBIO, &optval);
【讨论】:
以上是关于一旦发生另一个事件,我的 libevent 计时器就会停止……这正常吗?的主要内容,如果未能解决你的问题,请参考以下文章