Vista の Winsock - recv関数がなんかおかしい?
当サークルのソフトウェア、薔薇乙女メールチェッカー きてますか?きてませんか? ですが、コレ動作対象プラットフォームを
- Windows 2000
- Windows XP
- Windows XP 64bit Edition
- Windows Vista (たぶん)
という事にしておいたのです。 Windows 2000 での開発がメインなので、それ以降のOSであればマズ動くだろうし、実際 WinXP-32, WinXP-64 ではなんの問題なく動作確認してくれたんですね。 WinServer 2000/2003 は環境がないので動作してませんけれども(ぉ ^^;
でまぁ、近頃Vistaβ2が一般に公開されまして、銀ちゃんと兎さんの所で Vista上で薔薇乙女たちが活動してくれるのか確認して持ったのですよ。そしましたら
ちゃんと動いてくれたようで何よr
銀「なんか、メールチェックしにかないみたいよ?上手く動いてないみたい。蒼い子ジャンク化しとるわなー」
ジャンクなの自分自身なんじゃないかt
う〜ん? 特に問題が発生しそうな個所はないんだけどなぁー ってことで、とりあえず通信ログを取ってもらったところ
@@@ FieldName = ***, Address = ***, Port = 110, Abort = 15s, Ignore = 0 +OK IUSER *** nterMail POP3 proxy server ready. ユーザー名が不正です
● [21:49:43] !いろきゅう&はる[整]#どうすっかねぇ^^; の発言:
今更気づいた。+OK IUSER ***
nterMail POP3 proxy server ready.というレスポンス自体がなんか変な気がした。
● [21:51:11] Erey@VISTA β2キタ━(゚∀゚)━! の発言:
そうそう
正確には・・・
”+OK I”の後に、”nter〜”って続くんだけど、何故か途中でUSER〜が入っちゃってるなおかつ、レスポンスが分かれちゃってるから、"+OK"が来なくて、ユーザ認証ができなかった物とプログラムが判断しちゃった(w;
なんじゃこりゃーーーーーー!!!! *2
別(つーか、銀オリジナル)のメールチェックテストアプリで動作とってみたところ、どう頑張っても recv で 5 が返ってくる == 5文字読み取りしか出来てない様 なのですよ。
銀ちゃんのところの Vista マシンがおかしいんじゃないのー? ジャンクジャンクー! とか思ってみたのですが、兎 vista でも同様の現象が起きてしまうらしい。 ついでに、仮想PC上のvista でも同様のことが起きるようで……
う〜ん、薔薇乙女メールチェッカーでも5文字の recv っぽいものを、銀オリジナルでも 5文字の recv っぽい事してる。 しかも複数環境で……
……ってことはなんですか。 Vista のバグ?
いやまぁ、流石に最初は自分のコードを疑いましたけど、
// SOCKET_ERROR は省略^^; // データがある間は全部バッファに溜め込んでしまう while(r != 0) { recv(〜); r = select(); }
なんてやってるので、たぶん問題ないと思うんですけど……。
う〜ん……?
と思ったら
● [3:21:06] Erey@VISTA β2キタ━(゚∀゚)━! の発言:
OK
どうにか通った〜結局、recv一回=一行と言う仮定での実装ではなく、きっちり\r\nまで受信して一行とする実装じゃないとダメって言うのが結論ですた
● [3:22:32] !いろきゅう&はる[整]#どうすっかねぇ^^; の発言:
この情報を受けて、バグ fix しなきゃならん…
って
● [3:23:04] !いろきゅう&はる[整]#どうすっかねぇ^^; の発言:
おかしいなぁ…recv したら select でデータ待ちしてるんだけども…むむーん。
● [3:27:18] !いろきゅう&はる[整]#どうすっかねぇ^^; の発言:
recv って、絶対5バイトしか読み取れなかったりするのかな?
● [3:28:02] Erey@VISTA β2キタ━(゚∀゚)━! の発言:
一回目の受信はウチでもをぐさんの所でも5byte
それ以降は・・・ちゃんと一行送られてきてるような(w;
● [3:28:12] !いろきゅう&はる[整]#どうすっかねぇ^^; の発言:
わけわからん。(笑
● [3:28:32] !いろきゅう&はる[整]#どうすっかねぇ^^; の発言:
Vista の仕様なのか…仕様ということでいいのかしら〜!? orz
● [3:30:05] Erey@VISTA β2キタ━(゚∀゚)━! の発言:
本気で、最初のサーバからのレスポンスだけ5byte受信
それ以降は5byteしかとかいうことなく受信
● [3:30:41] Erey@VISTA β2キタ━(゚∀゚)━! の発言:
少なくとも、2つの環境(仮想マシン含め3環境・・・全部32bitだけど)では再現性ありです(w;
● [3:32:03] !いろきゅう&はる[整]#どうすっかねぇ^^; の発言:
Vistaー
Vistaー
絶対 Vista だってこれwwww orz
まぁつまりは
- 最初の recv は 5文字読み込める
- 次からの recv は 一杯読み込める
…し、仕様ということで宜しいアルか…。 orz
でも、recv() の後 select() で直ちにデータ待ちしてるのに「データが来ない」って処理されちゃってるって事は、データが届いてない…? パケットの到達が遅い? つか、そもそも select 待ちするのは間違い…? orz
……何…この、何。 (つД`)
通信アプリは難しい…