web-dev-qa-db-ja.com

非同期ソケットとは何ですか?

非同期ソケットとは何ですか?それらは通常のソケット(ブロッキングおよび非ブロッキング)とどのように異なりますか?

その方向へのポインタやチュートリアルへのリンクが役立ちます。

ありがとう。

23
Jay

非同期でソケットと通信するには、次の3つの方法があります。

  1. 通常のソケットを開きますが、何かを読み取ることがわかるまで、ソケットから読み取らないでください(read()ブロックがあるため)。 select()またはpoll()を使用して、ソケットから読み取るデータがあるかどうかを確認し、何かがある場合は、read()が勝ったように読み取ります。ブロックしません。

  2. fcntl()関数で_O_NONBLOCK_フラグを設定して、ソケットを非ブロッキングI/Oに切り替えます。この場合、read()はブロックしません。

  3. ioctl()FIOASYNCオプションを使用して、ソケットの_O_ASYNC_フラグを設定します(詳細については、_man 7 socket_を参照してください)。この場合、ソケットから読み取るものがあるときにSIGIOシグナルを受信します。

3番目のアプローチは非同期ソケットです。

29
qrdl

NIXネットワークプログラミング:ソケットネットワークAPI でのI/Oの次の5つの異なるモデルの比較が役立ちます。

ブロッキング

ノンブロッキング

I/O多重化

信号駆動型I/O

非同期I/O

3
Andy

サーバーが同期ソケットを使用している場合、クライアントからのデータを待機している間、サーバーのメインスレッドはブロックされるため、サーバーは何も実行しません...複数のクライアントが接続している場合は問題です。非同期ソケットでは、クライアントからデータが送信されるのを待っている間に他のことを実行できるため、複数のクライアントを接続できるようになりました。

Synchronousは、メッセージを受け取るまでブロックするreceive()のような関数を使用します

非同期にはbeginReceive()endReceive()または同様の関数があります。コールバックを使用し、メッセージを受信すると、コールバックが呼び出されます

2
Warty