みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

wininetのSendRequestでエラー

すみませんが、自分の知識不足の為に原因が分からない為、質問させてもらいます。
現在、こちらで作成しているプログラムで、WininetでHTTP通信をしているプログラムがあるのですが、本処理で以下の事象が発生しています。

事象発生のプログラム処理概要
(1)以下の処理でセッション生成
CInternetSession* g_pSession = new CInternetSession();
(2)上記処理後、以下の順で通信処理実施
CHttpConnection* pConn = g_pSession->GetHttpConnection(サーバ名, ポート番号);
CHttpFile* lpHttpFile = pConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, 相対パス);
BOOL bRet = lpHttpFile->SendRequest(ヘッダ, データ, データ長);

この後、接続したサーバに対して、一定間隔で空データで通信を行い、相手側の生死チェックを行っているのですが、一定時間通信をしていると、ERROR_INVALID_HANDLE(ハンドル無効)のエラーが出て、セッションを張り直すまで回復しない(ハンドル無効が出続ける)状態になります。

言語はC++で作成しており、動作環境はWindows7SP1になります。
この手の通信は、同じハンドルを使用し続けるとダメだとか、そういう制約や問題は聞いたことがなかったため、このような事象に心当たりがある方がいたら、教えて頂けますでしょうか。

投稿日時 - 2017-09-05 11:17:46

QNo.9371132

困ってます

質問者が選んだベストアンサー

3日間も接続していたら その間にWebサーバーのメンテナンスやアップデートやログローテーションで再起動とかありませんかね。
もしくはネットワークのメンテナンスとか。

投稿日時 - 2017-09-05 22:54:58

お礼

すみません、文章を入れて押したと思ったら別のボタンを押してたみたいで、反映さえてませんでした。
本件については、その後の内部調査で原因が判明しました。
原因は、上記で記載している「CHttpFile」のクラスを通信後に解放(削除)していなかった為、ゴミデータが溜まり続けてページファイルが圧迫された結果OSが通信を強制遮断していたみたいです。
お忙しいところ、連絡していただきありがとうございました。
本回答をベストアンサーとして、閉じさせてもらいます。

投稿日時 - 2017-09-07 15:30:06

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

1回のTCP接続で複数のHTTPリクエストを処理できるようになったのはHTTP/1.1からのKeepAlive機能ですが、
KeepAliveのTimeout時間以上の間隔が空くと、
コネクションが自動的にCloseされますのでそれの関係ではないですか?

投稿日時 - 2017-09-05 17:10:57

補足

連絡いただきありがとうございます。
それについては、こちらも可能性を考えて調査しました。結論としては、その可能性はなさそうと言う感じです。
事象発生時は、通信を開始してから端末が起動し続けて、約3日間通信を行っていましたが、通信間隔はこちらが設定した時間の±0.3秒以内で通信を継続しており、事象が発生した時もその中に納まっていました。
また、途中で何らかの負荷がかかったのか、1回だけ+3秒ほど間隔が空いた時がありましたが、そのタイミングでも問題なく通信を継続していた為、KeepAliveのTimeoutは可能性は低いとみています。

投稿日時 - 2017-09-05 20:17:14

あなたにオススメの質問