ノンブロッキングなconnectを書く

ソケット通信、あるいはTCP的な話。
今回はコードなしです。

ブロッキングなconnectだと上手くいくけど、ノンブロッキングにした瞬間から何故か変な動作になった。

C言語さんのいけず。

何が悪かったのか

getsockoptを使ってエラーチェックを怠っていた

戻り値と第四引数をチェックしないといけない。

selectの戻り値を確認せずにgetsockoptでエラーチェックを行っていた

selectの戻り値が0だとそれは「関数は正常に動いたけどファイルディスクリプタはないね」状態。
そのまま処理を進めるとgetsockoptの戻り値・第四引数は正常っぽい値を返す。

ノンブロッキングにした時に確認すべき事
  1. selectの第三引数に値を設定する
  2. selectの戻り値はチェックする
  3. getsockoptの戻り値をチェックする
  4. getsockoptの第四引数をチェックする
  5. errnoの値を確認する

得られた教訓

  1. システムコールのドキュメントはちゃんと読もう
  2. errnoの値はちゃんとチェックしよう
  3. 複数の情報源から内容を統合してきっちりとやろう