特定のポートがパケットを受信したときに特定の関数が呼び出されるようにするにはどうすればよいですか?
(ここでの「ポート」とは、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_SETSIG
)とSA_SIGINFO
リアルタイム信号を使用するハンドラーで、準備ができているfdを別のfdと区別するのに十分です。