非同期ソケットとは何ですか?それらは通常のソケット(ブロッキングおよび非ブロッキング)とどのように異なりますか?
その方向へのポインタやチュートリアルへのリンクが役立ちます。
ありがとう。
非同期でソケットと通信するには、次の3つの方法があります。
通常のソケットを開きますが、何かを読み取ることがわかるまで、ソケットから読み取らないでください(read()
ブロックがあるため)。 select()
またはpoll()
を使用して、ソケットから読み取るデータがあるかどうかを確認し、何かがある場合は、read()
が勝ったように読み取ります。ブロックしません。
fcntl()
関数で_O_NONBLOCK
_フラグを設定して、ソケットを非ブロッキングI/Oに切り替えます。この場合、read()
はブロックしません。
ioctl()
のFIOASYNC
オプションを使用して、ソケットの_O_ASYNC
_フラグを設定します(詳細については、_man 7 socket
_を参照してください)。この場合、ソケットから読み取るものがあるときにSIGIO
シグナルを受信します。
3番目のアプローチは非同期ソケットです。
サーバーが同期ソケットを使用している場合、クライアントからのデータを待機している間、サーバーのメインスレッドはブロックされるため、サーバーは何も実行しません...複数のクライアントが接続している場合は問題です。非同期ソケットでは、クライアントからデータが送信されるのを待っている間に他のことを実行できるため、複数のクライアントを接続できるようになりました。
Synchronousは、メッセージを受け取るまでブロックするreceive()のような関数を使用します
非同期にはbeginReceive()endReceive()または同様の関数があります。コールバックを使用し、メッセージを受信すると、コールバックが呼び出されます