Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

httpダウンロードを続けると止まっ てしまうのですが

886 views
Skip to first unread message

Toshi

unread,
Apr 14, 2002, 5:55:54 AM4/14/02
to
Visual C++でhttpファイルからデータを連続して読み込んでいます。
最初の数十回はOKなのですが、かならずhttpFile->Readの途中で
とまってしまいます。色々本を調べたりしたのですが解りません。
どなたかアドバイス願います。
プログラムの流れは以下のとおりです。

アドレス指定
CInternetSession *session = new CInternetSession(_T("http sample"));
httpCon = session->GetHttpConnection(strServerName, nPort);
httpFile = httpCon->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject);
httpFile->AddRequestHeaders(_T("Accept: text/*\r\nUser-Agent:
http_Sample\r\n"));
httpFile->SendRequest();
httpFile->QueryInfoStatusCode(dwRet);
と通常手順できてその後ステータスがOKなら読み込みます。
try {
do {
count = httpFile->Read( buff, 2048 ); <----ここでとまるのです。
buff[count] = 0;
total += count;
*fileCont += buff;
} while (count == 2048 && total < 204800);
}
オブジェクトを破棄して終了。
つぎのアドレスについて繰り返す。

以上数十個のアドレスについては正常に作動するが、いずれとまるのです。
なにか本来やっておくべきことが抜けているのでしょうか?調べるのに疲れました。
HELP!

Toshi


Shin-ichi Ueta

unread,
Apr 14, 2002, 7:50:32 AM4/14/02
to
こんにちは、植田です。

Toshi wrote:
> count = httpFile->Read( buff, 2048 ); <----ここでとまるのです。

確証はありませんが、Read()で止まるということはEOFに
達していないのにデータの続きが来ない状況が考えられ、
一番疑わしいのはkeep-alive絡みかな、と。

# HTTP/1.1ではkeep-aliveがデフォルトで、WinInetが
# 送信するリクエストを見るとConnectionヘッダがないので、
# コネクションが切断されるのを延々と待っているのでは
# ないかと...。

CHttpFile::AddRequestHeaders()で"Connection: close"を
追加してみるとか、CHttpConnection::OpenRequest()で
INTERNET_FLAG_KEEP_CONNECTIONフラグを試してみるとか。

# まぁ、あくまで可能性の話ということで^^;)


--
植田システム設計事務所
Ueta System Design Studio
植田真一
usde...@par.odn.ne.jp

Shin-ichi Ueta

unread,
Apr 14, 2002, 11:12:49 AM4/14/02
to
どうも、植田です。自己フォローです。

Shin-ichi Ueta wrote:
> 一番疑わしいのはkeep-alive絡みかな、と。

そういうわけではなさそうですね^^;)

一応WinInet側もHTTP/1.1を通知していますし、
www.microsoft.co.jp が相手でも問題ありません。
単にダウンロードしようとしているリソースがデカいとか、
ネットワークが滞っているとか、サーバーがトロいとか、
その辺りの問題はありませんか?

あとは、オブジェクトのdeleteを忘れているとか...?

質問にあったコードに各オブジェクトのClose()とdeleteを
加えて、サーバーに100回リクエストを投げてみましたが、
それらしい現象は再現できませんでした。

# Win98SE+VC6SP5
# 同じサブネット内のWWWサーバーから1864bytesの
# HTMLファイルをダウンロード

Toshi

unread,
Apr 14, 2002, 11:46:51 AM4/14/02
to
植田さん。色々アドバイスありがとうございます。ご指摘の件
ちょっとトライして見ましたがまだ解決には到っていません。
アドバイスを正しく実行していないのかも知れませんし、明日
以降落ち着いて頑張ってみようと思います。とにかく一ヶ月以
上悶々としている件なので、ヒントを頂くだけでも嬉しくなりま
す。(^o^)

> 単にダウンロードしようとしているリソースがデカいとか、
リソースは10k~40kぐらいです。

> ネットワークが滞っているとか、サーバーがトロいとか、
ケーブルネットです。サーバーも含めそんなにトロくはな
いと思います。

> あとは、オブジェクトのdeleteを忘れているとか...?
closeとdeleteはちゃんと入れています。

それから私もWin98SE+VC6です。

Toshi

Shin-ichi Ueta <usde...@par.odn.ne.jp> wrote in message
news:OJb8ab84BHA.2740@tkmsftngp07...

momiji_teruyama

unread,
Apr 15, 2002, 5:31:44 AM4/15/02
to
関係ないかも知れませんが
char buff[2048]
なら

count = httpFile->Read( buff, 2048 );
でcount==2048なら
buff[count] = 0;
で領域をオーバーします。

Toshi

unread,
Apr 15, 2002, 7:49:55 AM4/15/02
to
ありがとうございます。char buff[2049]とっています。
なかなか原因わからず、頭がクラクラしています。
また何か気が付いたらお願いします。

Toshi

momiji_teruyama <ma...@p1.coralnet.or.jp> wrote in message
news:#igSt8F5BHA.1900@tkmsftngp02...

Toshi

unread,
Apr 15, 2002, 10:17:29 AM4/15/02
to
植田さん。どうも。
WindowのKeepAliveTime(接続チェックが始まる時間)のディフォルト値が2時間
と書いてあったので「これだ!」と思って、HKEY_LOCAL_MACHINE\System
\CurrentControlSet\Services\VxD\MSTCP\KeepAliveTime =60000 (60秒)
にレジストリを変更してみましたが、ダメでした。(残念!) またボチボチ考えて
みます。

Toshi

Shin-ichi Ueta

unread,
Apr 15, 2002, 10:33:00 AM4/15/02
to
どうも、植田です。

keep-aliveの線はなさそうですね。
WinCEの古い実装ではHTTP/1.1をサポートして
いなくて、これに引っかかっていたようですが...。

HTTPセッションが本当に正常に行われて
いるかどうかネットワークモニタで確認して
みたいところですね。

WWWサーバーには何を使っていますか?

Toshi

unread,
Apr 17, 2002, 8:46:27 AM4/17/02
to
植田さん。どうも

> WWWサーバーには何を使っていますか?
どこを見に行っているということでしょうか。
YahooやLycosで投資情報を集めに行っています。
http://chart.yahoo.co.jp/t?c=2001&a=4&b=9&f=2002&d=4&e=17&g=w&s=7731.t&y=0&z
=7731.t
http://money.lycos.co.jp/stocks/research.html?u0=7731

> HTTPセッションが本当に正常に行われて
> いるかどうかネットワークモニタで確認して
> みたいところですね。
まだ通信に関しては、全くの初心者ですので、まともな理解能力がないので、今の状

では問題解決は大変だと思います。知り合いからhttp://www.nakka.com/のNAKKAさん
のサイトでAPIsocketを使ったプログラムのソースを紹介していることを教えてもら
いまし
た。これ以上植田さんにお付き合い頂くのも心苦しいですし、また勉強にもなります
ので、
今のCinternetクラスはあきらめて、APIsocketを使ったプログラムに変更しようかと
思っ
ています。

Toshi

Shin-ichi Ueta

unread,
Apr 17, 2002, 9:27:20 AM4/17/02
to
どうも、植田です。

Toshi wrote:
> > WWWサーバーには何を使っていますか?
> どこを見に行っているということでしょうか。
> YahooやLycosで投資情報を集めに行っています。

まさかとは思いますが、DoS攻撃と間違われているとか...。

Toshi wrote:
> これ以上植田さんにお付き合い頂くのも心苦しいですし、

ちゃんとマナーを守って投稿していれば、私でなくても
誰かがフォローしてくれますよ。きっと^^)

Yoshio Kiya

unread,
Apr 17, 2002, 8:49:46 PM4/17/02
to
 Toshiさん、こんにちは木屋です。

Toshi wrote in <umTFdq54BHA.1864@tkmsftngp07>
> プログラムの流れは以下のとおりです。

 タイムアウトが設定されていないようですので、相手が途中で黙
りを決め込むと止まってしまうと思います。

CInternetSession *pSession = new CInternetSession(_T("http sample"));
pSession->SetOption( INTERNET_OPTION_CONNECT_TIMEOUT, 30*1000 );
pSession->SetOption( INTERNET_OPTION_RECEIVE_TIMEOUT, 30*1000 );
pSession->SetOption( INTERNET_OPTION_SEND_TIMEOUT , 30*1000 );

 としてみてください。

# 30*1000 は 30 秒 です。

=== Nihon Application Co.,LTD. 木屋 善夫 ki...@nac.co.jp ===

Toshi

unread,
Apr 19, 2002, 8:04:01 AM4/19/02
to
>  タイムアウトが設定されていないようですので、相手が途中で黙
> りを決め込むと止まってしまうと思います。
>
> CInternetSession *pSession = new CInternetSession(_T("http sample"));
> pSession->SetOption( INTERNET_OPTION_CONNECT_TIMEOUT, 30*1000 );
> pSession->SetOption( INTERNET_OPTION_RECEIVE_TIMEOUT, 30*1000 );
> pSession->SetOption( INTERNET_OPTION_SEND_TIMEOUT , 30*1000 );
>
>  としてみてください。

木屋さん。ありがとうございます。INTERNET_OPTION_CONNECT_TIMEOUTについては
やってみていたのですが、RECEIVE_とSENDは未実施でした。早速適用したらOKにな
りました。ただし後日談があります。。。。。。。。
念のため、タイムアウトオプションを元に戻して(外して)チェックしたところ、何
とあれだ
け途中でフリーズしていたのが、あっさりOKになってしまいました。本当に馬鹿に
して
います。おそらくたまたまと思うので、チェックしておきます。

これで問題なければヒャッホーです。ありがとう。

Toshi


Yoshio Kiya <ki...@nac.co.jp> wrote in message
news:20020418094946.2...@nac.co.jp...


>  Toshiさん、こんにちは木屋です。
>
> Toshi wrote in <umTFdq54BHA.1864@tkmsftngp07>
> > プログラムの流れは以下のとおりです。
>
>

Toshi

unread,
Apr 19, 2002, 8:19:44 AM4/19/02
to
またまたToshiです。お騒がせします。

>  タイムアウトが設定されていないようですので、相手が途中で黙
> りを決め込むと止まってしまうと思います。
> CInternetSession *pSession = new CInternetSession(_T("http sample"));
> pSession->SetOption( INTERNET_OPTION_CONNECT_TIMEOUT, 30*1000 );
> pSession->SetOption( INTERNET_OPTION_RECEIVE_TIMEOUT, 30*1000 );
> pSession->SetOption( INTERNET_OPTION_SEND_TIMEOUT , 30*1000 );
>  としてみてください。

との木屋さんのアドバイスでOKになりそうですが、一つだけ気になることが
あります。

SessionKeepAlive = milliseconds を設定してもいけるのではないでしょうか?

MSのサイトをみているとNetBT(NetBios over TCP/IP) ではSessionKeepAlive
と書いてあるので、ひょっとしたらCInternetSessionはSessionKeepAliveを設定
したらよかったのではと思うのですがどうでしょうか。
実験すればわかるのはずですが、実験の再現性が不確かな点あるので結論
はすぐには出ないので。わかる方おられればご教示ください。

Toshi

0 new messages