Title

socket()の戻り値0は正常値である!!!

ネットワークプログラミングの基本中の基本。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);
}

みたいなミスもうっかりやりがちなのでお気をつけください。

コメント / トラックバック 2 件

chris kyle2019/04/15 01:59

I had an excellent expertise at Launch Academy.

Todd2019/09/10 13:30

Read more in my Overnight Freedom Evaluate.

Leave a Reply

E-Mail (will not be published)
Comment
*

カレンダー

2024年11月
 123
45678910
11121314151617
18192021222324
252627282930  

▲Pagetop