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

Multiple tcp connections in single thread with using libevent or boost::asio. It's possible?

本文关键字:boost libevent asio 有可能 使用 线程 连接 tcp 单个      更新时间:2023-10-16

是否可以使用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?例?)

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

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

  • protor和async_write
  • 异步和同步操作的说明

正如托尼在他的回答中指出的那样,Boost。Asio有很好的例子来详细解释异步概念。本教程,特别是异步日间服务器,也是一个很好的起点。

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

我不熟悉libevent来帮助你。

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

是的,这是可能的。

你也可以用evconnlistener_new_bind创建一个监听多个端口的服务器。

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

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