Несколько соединений TCP в одном потоке с использованием libevent или boost :: asio.Возможно? - PullRequest
0 голосов
/ 14 апреля 2011

Можно ли использовать 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 ]

2 голосов
/ 14 апреля 2011

Кроме того, подобное может быть реализовано с помощью boost :: asio? Пример?)

Да, это вполне возможно. Это основа шаблона проектирования проактора, продвигаемого Boost.Asio. Он обеспечивает параллелизм без использования явных потоков, избегая операций блокировки, таких как connect, accept, read и write. Вы можете найти некоторые из моих предыдущих ответов полезными здесь

Как указал Тони в своем ответе , в Boost.Asio есть фантастические примеры, подробно объясняющие асинхронные концепции. Учебное пособие, а именно асинхронный дневной сервер , также является хорошим местом для начала.

1 голос
/ 14 апреля 2011

Вы можете использовать boost :: asio для запуска в потоке, который принимает соединение асинхронно. На странице документации boost :: asio есть примеры , в которых показано, как настроить сервер, который принимает несколько соединений в одном потоке.

Я не знаком с libevent, чтобы помочь вам там.

0 голосов
/ 21 февраля 2014

Можно ли использовать libevent для создания нескольких TCP-соединений с разными серверами в одном потоке? Не могли бы вы написать пример реализации такой задачи?

Да, это возможно.

Вы также можете создать сервер, который прослушивает несколько портов с evconnlistener_new_bind.

А если вы хотите обработать один или несколько сигналов, вы можете использовать evsignal_new для добавления сигналов в базу событий.

В каждом случае (bufferevent_socket_new, evconnlistener_new_bind и evsignal_new обратные вызовы для каждого события, вероятно, будут отличаться.

...