socket()の戻り値0は正常値である!!!
Posted on 2014年10月10日(金) 21:00
ネットワークプログラミングの基本中の基本。socket()関数があります。
(基本すぎて今ではもう直接使う人はいないのかもしれませんが僕は使います。。)
socket()関数は戻り値としてソケットのファイル・ディスクリプタを返します。
このソケットのファイル・ディスクリプタが何故か現代人には勘違いしやすいようで、うっかり0をエラー値だと思い込んでしまいます。socket()はエラーが発生したときには-1を返します。
これがうっかり間違えます。実際0が返ってくることがありますのでたまに動かないという分かりにくい不具合の原因になります。
わかっているのにうっかり間違えた例が以下のような感じです。本当に良く見かけます。自分も間違えますが・・・。
int fd = socket(AF_INET, SOCK_STREAM, 0); if (fd <= 0) { // COV_NF_START - we'd need to use up *all* sockets to test this? startFailureCode = kGTMHTTPServerSocketCreateFailedError; goto startFailed; // COV_NF_END }
おそらくポインタを返す時の失敗はNULLだろう、ハンドルを返すときのエラーは0だろう的な思い込みがあるせいではないかと思います。
WindowsのAPIは成功すると非ゼロを返すという仕様のものが多いので、そういう普段使っている環境での慣れもあるのかも・・・。
ちなみに上記のコードはGoogle Toolbox for Macの一部にありました。
同様に
if(soc){ close(soc); }
みたいなミスもうっかりやりがちなのでお気をつけください。