0

新しいパケットが到着するたびにハンドラーが呼び出されるように、UDP ポートのコールバックを指定したいと考えています。

fcntl() を使用してファイル記述子が SIGIO を発生させることについては知っていますが、物事はそれほど単純ではないとしましょう。ソケット a を持つオブジェクト A とソケット b を持つオブジェクト B があります。ソケット a は新しいパケットを受信するため、SIGIO が発生します。ただし、これはオブジェクト A にのみ影響し、オブジェクト B とは関係ありません。

特定のポートがパケットを受信したときに特定の関数が呼び出されるようにするにはどうすればよいですか?

4

3 に答える 3

2

Boost.ASIOライブラリの使用をお勧めします。非同期 I/O 用に設計されています。

于 2009-08-10T13:39:52.123 に答える
1

特定のポートがパケットを受信したときに特定の関数が呼び出されるようにするにはどうすればよいですか?

(ここでの「ポート」とは、UDPソケットを表すS_IFSOCK ファイル記述子を意味していると思います。)

I / O駆動型アプリで利用できる一般的なオプションは多数あります。リーダースレッドのブロック、 select(2)またはpoll(2)SA_SIGINFOなどとの多重化、シグナル通知の要求(特に、ハンドラーでのキューイングリアルタイムシグナルと追加情報の使用) 、 aio_read(2)を介した非同期I/O 。簡単な概要については、こちらをご覧ください。

さらに良いことに、他の場所で言及されているBoost.ASIOやlibeventのように、これらの厄介な詳細を抽象化するサードパーティのライブラリを使用してください。

ソケットaは新しいパケットを受信するため、SIGIOを発生させます。ただし、これはオブジェクトAにのみ影響し、オブジェクトBとは関係ありません。

まあ、正確ではありません。シグナルは、プロセス内のスレッド(場合によっては選択したスレッド)に配信(「処理」)され、その意味でオブジェクトAにもオブジェクトBにも直接影響しません。:)おそらく、プレーンSIGIOがソケットAの「データレディ」とソケットBの「データレディ」を区別できないということですか?

その場合は、プレーンを使用しないSIGIOでください。Linuxでは、fcntl(F_SETSIGSA_SIGINFOリアルタイム信号を使用するハンドラーで、準備ができているfdを別のfdと区別するのに十分です。

于 2009-08-10T22:26:49.877 に答える
1

Boost.SignalsまたはBoost.Signals2(スレッドセーフバージョン)が役立つ場合があります。

于 2009-08-10T13:52:19.190 に答える