0

libevent を使用して、1 つのスレッドで異なるサーバーへの複数の 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 が提唱する proactor デザインパターンの基本です。、、、、などのブロック操作を回避することで、明示的なスレッドを使用せずに同時実行をconnect実現acceptreadますwrite。ここで私の以前の回答のいくつかが役立つかもしれません

Tony がanswerで指摘したように、Boost.Asio には、非同期の概念を詳細に説明する素晴らしい例があります。チュートリアル、特に非同期デイタイム サーバーも、開始するのに適した場所です。

于 2011-04-14T17:32:24.357 に答える
1

boost::asio を使用して、接続を非同期で受け入れるスレッドで実行できます。boost::asio ドキュメント ページには、単一のスレッドで複数の接続を受け入れるサーバーをセットアップする方法を示す例があります。

そこに役立つ libevent に詳しくありません。

于 2011-04-14T07:12:51.373 に答える
0

libevent を使用して、1 つのスレッドで異なるサーバーへの複数の tcp 接続を作成することは可能ですか? そのようなタスクのサンプル実装を書いていただけますか?

はい、可能です。

を使用して、複数のポートでリッスンするサーバーを作成することもできますevconnlistener_new_bind

また、1 つ以上のシグナルを処理したい場合は、 を使用evsignal_newしてイベント ベースにシグナルを追加できます。

それぞれの場合 ( bufferevent_socket_newevconnlistener_new_bindおよびevsignal_new、各イベントのコールバックは異なる可能性があります。

于 2014-02-21T17:55:49.843 に答える