いろんなものはつながっている

オーバラップI/Oとブロッキング/ノンブロッキングの違いは?

OverlappedI/OとBlockin/NoBlockingの違いはなんだ?と思い検索してみたところ、ばっちりのタイトルがMSのサポートにあった。しかし、両者は”違う”ということは書いてあったが具体的に何が違うかまで書いてなかった。

そのサポートからの抜粋。
・Overlapped I/OとBlocking/NonBlockingは別物。
・NonBlockingモードでソケットを動作させるにはソケットにWSA_FLAG_OVERLAPPEDフラグを設定しておく必要がある。
・NonBlokingモードで処理が瞬時には終わらなかったとき、エラーがかえりWSAGetLastError()では、WSAEWOULDBLOCKをかえす。
・overlapped I/O操作で処理が瞬時には終わらなかったとき、エラーがかえりWSAGetLastError()では、WSA_IO_PENDING or ERROR_IO_PENDING
・Socket作成後に、SocketのOverlappedI/O属性の有無を変更することはできない。ただし、SO_OPENTYPEオプションを用いることでその後に作成される(?)ソケットのOverlappedI/Oの属性を変更することができる。

また、ノンブロッキングI/Oと非同期I/Oの違いを理解するというサイトによると、
・ノンブロッキングでは、処理がまだ完了していないことをエラーを返すことで知らせてくれる。通知はしてくれない。
・非同期I/Oは、I/O処理が完了したタイミングを通知する。
だそうな。

「C#プログラマのための.NETアプリケーション最適化技法」のp.254に

Windowsでソケット入出力を行う方法には、ブロッキング、非ブロッキングとポーリング、非同期など複数あります。

という記述がある。

つまり、(送受信)処理完了通知をしてくれるか否かが、ノンブロッキングとoverlappedI/Oの違いのひとつということなのかな。

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク