0

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

4

3 回答 3

2

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

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

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

于 2011-04-14T17:32:24.357 回答
1

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

我不熟悉 libevent 来帮助你。

于 2011-04-14T07:12:51.373 回答
0

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

是的,有可能。

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

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

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

于 2014-02-21T17:55:49.843 回答