WinInet ライブラリや、 その MFC ラッパーである CInternetSession を利用して作った Web クライアントプログラムは、 キープアライブ状態がタイムアウトした結果サーバが送ってくる FIN に応えない。 " Connections in the FIN_WAIT_2 state and Apache" で説明されている現象である。 こちらにお仲間もいらっしゃる。
しかし IE6 では問題ない。IE も WinInet を使っているはずだが、 サーバからの FIN に対し RST で応答していた (RST ってのが気持ち悪いけれど)。
何で動きが違うのか。 WinInet プログラムを、IE と同じように動作させる方法はないのか。 とマイクロソフトに問い合わせたところ、驚いたことに問題の所在を認めない。 曰く、IIS はタイムアウトすると RST を投げて接続を切る。 FIN で切るってのは、Apache のやってることでしょ。設定を見直してはいかが? IIS の話じゃないのでサポートできない。IIS で再現できないので調査もできない。
ふざけんな。パケットレベルの話をしているのであって設定は関係ないだろう。 何でここで IIS が出てくるのか理解できない。云々。 と反論したのですが、相手は同じことを繰り返すばかり。 一時間半ほど延々とバトルしたが、結局取り合ってくれませんでしたね。 電話を終えるころには、怒りで本当に胃が痛みました。
その後。 非同期モードを使い、通信が終ったら取得したハンドルを全てクローズすることで 目的が達成できることが MS より示された (なお正確には、InternetOpen() で得たハンドルまでクローズする必要はない)。 たしかにこうしておけば、 サーバから FIN を受け取った 2 秒後に RST で応えてくれる。 そんなことどこにも書いてない。知るかよ。 ドキュメントミスだと思うが、解決策を提供したとか言ってしっかり金を取りやがる。 いい商売ですねー。
[2005.8.23]