以下は、ほぼ解決したと思われる後に書いてますw
uoclist動作テスト中なのですが、たまにコネロスが発生しました、ログイン直後とか、リコした先で。
そんなときに、先に書いたようにYou are deadで暗転となったりもするのですが、一番ひどかったのが、キックされたこと><
0x26コマンドなんて、実際に使われるのを目の当たりにしたの、初めてだわ><
メイン垢、メインシャードで、BAN覚悟でやっているのですが、さすがにキックはドキッとした。。。
原因を調べてみても、特に原因らしいコードはみつからないのですよね。
なんでだろなんでだろ、って不具合なさそうなコードのチェック強化をしたり。
落ち着いて現象を分析すると、uoclist自身が落ちるわけではないので、uoclistのメモリエラーとかじゃない。クライアントとの通信部分でクライアントが落ちるんだ、とインジェクションdllの方を眺めてみて、、、理解しました。
UOSAクライアント/サーバになって、サーバから新しいコマンド(0xe5, 0xe6, 0xdf)を大量に送りつけてくるのですよ。で、僕の使っているインジェクションdllは、UOZを起源に(リスペクトして)使い続けているため、インジェクションdllとuoclistとの間をメッセージでやり取りしているのですね。
インジェクションdllでSendMessageしてrecv/sendの情報を逐一渡しているのです。
なので、大量にコマンドを送りつけられると、SendMessageでインジェクションdllの動作が止まる(uoclistでさばくのに時間がかかる)=クライアントのスレッドが止まる=クライアントの描画コードは待ち続けることが出来なくなって音を上げる
これがコネロスの真相だと思う。SendMessageはコード実行をブロックするからねぇ。
ということで、どうせ新コマンドはつかわないから、とインジェクションdllの中で使うコマンド使わないコマンドを選別して使うコマンドだけuoclistに送るようにしてやったら、コネロスは発生しなくなりました。
本当の原因は別にあって、これからもコネロスが発生するかもしれないですが、いまのところは全く発生しておりません^^
0 件のコメント:
コメントを投稿