Non Blocking Socket で気をつけること

ダウンロード機能をテストしていたら、Winnyのコネクションクラスがバグっている事に気づいたので修正した。

内容は、以下。

  1. 1コマンド受信の途中でタイムアウトが発生した場合に、そのままタイムアウト例外を投げているため、次の受信時にコマンドの変な位置から受信するので、変なことになる

ほんと初歩的。
コマンド受信の一つ前のレイヤとしてストリーム暗号があるので、発生するポイントによっては、復号開始位置がずれて、復号できなくなることもある。

修正方法としては、ものすごく悩んだ挙句、1コマンドの途中まで受信した状態でタイムアウトが発生した場合は、そのときの状態を保存しておいて、次の受信時にその続きから始めるようにした。(gotoとかで・・・)
これで、細切れになりながらも最終的には受信完了できるので、せっかくの検索リンクを切断する必要もなくなるかなと。
受信が完了しない間に、別の接続から受信できるし。

前々から、復号エラーが多発するなーとは思っていたんだけど、こんなことになっていたとは・・・

  • 追記

これを直したことで、保持キー数が軽く1万を超えるようになった。
これが原因のエラーで検索リンクをたびたび切断していたので、かなりよくない状態になっていたみたい。

というか、前もここ直したんですよね・・。
タイムアウトが短いから長くしただけという・・テキトウな修正で。
そのときは、なぜコマンドがずれていることに気づかなかったんだろ・・・。