使用 libevent 或 boost::asio 的单线程中的多个 tcp 连接。这是可能的?

Posted

技术标签:

【中文标题】使用 libevent 或 boost::asio 的单线程中的多个 tcp 连接。这是可能的?【英文标题】:Multiple tcp connections in single thread with using libevent or boost::asio. It's possible? 【发布时间】:2011-04-14 06:23:29 【问题描述】:

是否可以使用 libevent 在一个线程中创建到不同服务器的多个 tcp 连接?你能写一个这样的任务的示例实现吗?

我已经这样做了,但不确定它是否正确:

...
int num_of_connect = 5; /*for example*/
struct event_base *evbase;
struct bufferevent *bev[num_of_connect];
struct sockaddr_in sin[num_of_connect];
evbase = event_base_new();

for(int i=0;i<=(num_of_connect-1);i++)

   sin[i].sin_family = AF_INET;
   sin[i].sin_addr.s_addr = inet_addr(/*some addr*/);
   sin[i].sin_port = htons(/*some port*/);

   bev[i] = bufferevent_socket_new(evbase, -1, BEV_OPT_CLOSE_ON_FREE);

   bufferevent_setcb(bev[i], cb_evread, cb_evwrite, cb_event, NULL);
   bufferevent_socket_connect(bev[i], (struct sockaddr *)&sin[i], sizeof(struct sockaddr_in));


event_base_dispatch(evbase);
...

另外,类似的可以使用 boost::asio?例子?)

【问题讨论】:

【参考方案1】:

另外,类似的可以 使用 boost::asio? 例子?)

是的,完全有可能。这是 Boost.Asio 提倡的前摄器设计模式的基础。它通过避免connectacceptreadwrite 等阻塞操作,在不使用显式线程的情况下实现并发。您可能会发现我以前的一些答案在这里很有用

Proactor and async_write Clarification about asynchronous and synchronous operations

正如 Tony 在 his answer 中指出的那样,Boost.Asio 有很棒的示例详细解释了异步概念。该教程,特别是 asynchronous daytime server,也是一个很好的起点。

【讨论】:

【参考方案2】:

您可以使用 boost::asio 在异步接受连接的线程中运行。 boost::asio documentation page 上有示例,它将向您展示如何设置一个在单个线程上接受多个连接的服务器。

我不熟悉 libevent 来帮助你。

【讨论】:

【参考方案3】:

是否可以使用 libevent 在一个线程中创建到不同服务器的多个 tcp 连接?你能写一个这样的任务的示例实现吗?

是的,有可能。

您还可以使用evconnlistener_new_bind 创建一个侦听多个端口的服务器。

如果您想处理一个或多个信号,则可以使用evsignal_new 将信号添加到事件库。

在每种情况下(bufferevent_socket_newevconnlistener_new_bindevsignal_new,每个事件的回调可能不同。

【讨论】:

以上是关于使用 libevent 或 boost::asio 的单线程中的多个 tcp 连接。这是可能的?的主要内容,如果未能解决你的问题,请参考以下文章

Asio 或 Boost.Asio 能否在 iPhone 或 Android 上运行?

可以在没有 boost 或 C++11 的情况下使用 Asio 吗?

错误:C1083:无法打开包含文件:'boost/asio.hpp':没有这样的文件或目录

反应器(Reactor)和主动器(Proactor)

boost :: asio取消或关闭对async_handle不起作用

Boost::Asio 的 IOCP CompletionKey?