ソケット通信、あるいはTCP的な話。
今回はコードなしです。
何が悪かったのか
getsockoptを使ってエラーチェックを怠っていた
戻り値と第四引数をチェックしないといけない。
selectの戻り値を確認せずにgetsockoptでエラーチェックを行っていた
selectの戻り値が0だとそれは「関数は正常に動いたけどファイルディスクリプタはないね」状態。
そのまま処理を進めるとgetsockoptの戻り値・第四引数は正常っぽい値を返す。
ノンブロッキングにした時に確認すべき事
- selectの第三引数に値を設定する
- selectの戻り値はチェックする
- getsockoptの戻り値をチェックする
- getsockoptの第四引数をチェックする
- errnoの値を確認する
得られた教訓
- システムコールのドキュメントはちゃんと読もう
- errnoの値はちゃんとチェックしよう
- 複数の情報源から内容を統合してきっちりとやろう