ばぐう

以前からサーバーを放置しておくとSTATEがLISTENINGのソケットが知らない間に増殖して、ついにはソケットがアロケートできる限界に達してサーバーが動いていても外側からの接続に対応できなくなるという問題がおきていた。訳がわからず以前は適当に再起動をときどきかけたりしていたのだが、今回接続テストが行われる頻度が高くなり、それに伴って閉じられてるポートへconnect()しようとする、など、接続の試みが失敗するケースが多くなり、その失敗後の処理に原因をみつけることができた。connect()失敗後にsocket()で作ったソケットをclosesocket()していなかったのだ。普通に考えれば確かにそうしていないことにちょっとした違和感くらい感じてもいいように思うのだけど。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/basic-client.cpp
ここのEstablishConnectionという関数はこの失敗をやってしまっている。これを鵜呑みにして組んでたので問題がでてしまった。にしても通信基盤のバグは再現するのが難しくて発見しずらいぜ。「猫でもわかる」はちゃんとしてあるな。エライ。