2018/05/26

[c/c++]socketのshutdown()だけでは足りない

socketを使った、サーバっぽいアプリを作っている。

長時間動かしていると、なんか調子が悪い・・・。
メモリの使用量なんかも問題ないし、負荷が高いわけでもない。

なんとなくnetstatで見てみると、大量のFIN_WAIT2が残っていた。
なんだこれは・・・。


原因は、shutdown()だけしかしていないせいだったようだ。
close()したら、解決したようである。


い、言い訳をさせてください!


システムコールの本を読んでいて、shutdown()のところで「close()やプロセス終了でも閉じられるので、shutdown()を省略することもあります」みたいな説明が書いてあったのだ(手元に本がないので、私の記憶では、だが)。

そこを、何を勘違いしたのか「じゃあ、close()を書かずにshutdown()でもいいんだ」と解釈したのである。
冷静に考えれば、close()だけすればいいやん、と思いそうなのだが、そのときの私の心理を解説できるものはどこにもいない。。。



その前も、cURLでcurl_easy_init()とcurl_easy_cleanup()を繰り返していたら、TIME_WAITが大量に残るという現象を味わったばかりだった。
そのときは、接続先が1つしかなかったので、最初にinitしてハンドルをもらってきて、ずっと使い回すことで対応できたようだ。
サイトにも「You can do any amount of calls to curl_easy_perform while using the same easy_handle.」と書いているし、そのやり方でいいんだろうと思っている。

しかし、毎回異なるところへ接続するようだったら、また別のやり方を考えねばならんだろう。


socket関連って、原因に思い当たるノウハウがないと、なかなかつらいですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。