使用 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 提倡的前摄器设计模式的基础。它通过避免connect
、accept
、read
和write
等阻塞操作,在不使用显式线程的情况下实现并发。您可能会发现我以前的一些答案在这里很有用
正如 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_new
、evconnlistener_new_bind
和 evsignal_new
,每个事件的回调可能不同。
【讨论】:
以上是关于使用 libevent 或 boost::asio 的单线程中的多个 tcp 连接。这是可能的?的主要内容,如果未能解决你的问题,请参考以下文章
Asio 或 Boost.Asio 能否在 iPhone 或 Android 上运行?
可以在没有 boost 或 C++11 的情况下使用 Asio 吗?
错误:C1083:无法打开包含文件:'boost/asio.hpp':没有这样的文件或目录