[Winsock] non blocking socketのエラー検知

winsock2のselect Functionについてのドキュメントは以下にある。
http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx
OSによってふるまいが変わるnonblocking socketをselectの対象ファイルディスクリプタにする場合の注意点がまとめられている。
In summary, a socket will be identified in a particular set when select returns if:
readfds:

  • If listen has been called and a connection is pending, accept will succeed.
  • Data is available for reading (includes OOB data if SO_OOBINLINE is enabled).
  • Connection has been closed/reset/terminated.

writefds:

  • If processing a connect call (nonblocking), connection has succeeded.
  • Data can be sent.

exceptfds:

  • If processing a connect call (nonblocking), connection attempt failed.
  • OOB data is available for reading (only if SO_OOBINLINE is disabled).

これによれば、Winsock2を使ってnonblocking socketをconnet()するときには、exceptfdsを立てておかないとconnectのエラーを拾うことができない。
UNIX系では、エラーではread, writeともに立つことが多いとUNIX
Network Programming にはあったのでUNIXのプログラムを移植する場合、このあたりの変更が必須になる。
UNIXの場合でも接続が完了したかどうかの識別は困難でいくつかのやり方
のどれかで再確認しなければならない。

広告
%d人のブロガーが「いいね」をつけました。