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

时间:2011-04-14 06:23:30

标签: c++ c boost-asio libevent

是否可以使用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可以实现类似的功能吗?实施例?)

3 个答案:

答案 0 :(得分:2)

  

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

是的,完全有可能。这是Boost.Asio推广的proactor设计模式的基础。它通过避免阻塞connectacceptreadwrite等操作来实现并发而不使用显式线程。你可能会发现我之前的一些答案在这里很有用

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

答案 1 :(得分:1)

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

我不熟悉libevent来帮助你。

答案 2 :(得分:0)

  

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

是的,它可能。

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

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

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