是否可以使用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可以实现类似的功能吗?实施例?)
答案 0 :(得分:2)
另外,类似的可以 使用boost :: asio实现? 实施例?)
是的,完全有可能。这是Boost.Asio推广的proactor设计模式的基础。它通过避免阻塞connect
,accept
,read
和write
等操作来实现并发而不使用显式线程。你可能会发现我之前的一些答案在这里很有用
正如托尼在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_new
,evconnlistener_new_bind
和evsignal_new
,每个事件的回调可能会有所不同。