開発環境
自分のPC Vista、VC++ 2008、SDK
大学のPC 7、VisualStadio C++ 2010、SDK
以下のようにwinsockを使ってHTMLを取得するプログラムを作りました。
同じサーバから二つのHTMLを取得しようとしています。
例えば、「xxx.co.jp/aaa.html」と「xxx.co.jp/bbb.html」を取得しようとしています。
socket
↓
connect : xxx.co.jp
↓
send : 1つ目要求「Get /aaa.html」
↓
recv
↓
send : 2つ目要求「Get /bbb.html」
↓
recv
↓
shutdown
closesocket
このプログラムを自分のPCと大学のPCで試すと、
自分のPCだと2回目のrecvでWSAECONNABORTEDがエラーコードで返ってきて、受信に失敗します。
大学のPCだと正常に動きます。
なぜこのようなことがおきるのでしょうか?
何が原因か分からないので分かる範囲の情報を書いてみます。
自分のネット環境はケーブルテレビでネット接続しています。
大学のネット環境は詳しくは分からないですがプロキシがありました。
ご教授お願いします。
大学のプロキシ経由使えないの?
あまり、地震のない答え・・・・・・
HTTPなら…Keep-Aliveに設定していないとセーザ側からファイル送信がオワッタ後で切断される…かと。
http://d.hatena.ne.jp/dayflower/20081024/1224830945
とか。
接続先の対応状況によっては変わる…かもしれません。
# 今回の場合はプロキシが対応している可能性があるかと。
GET/POSTリクエストの際にConnetionヘッダを付与してみてはどうでしょうか?
http://www.studyinghttp.net/header#Connection
>HTTPなら…Keep-Aliveに設定していないとセーザ側からファイル送信がオワッタ後で切断される…かと。
誤字がひどいっすな。
「サーバ側からファイル送信が終わった後で」です。
HTTP/1.1だと…未指定でも接続されたまま…なのかも知れません。
パケットキャプチャでリクエストヘッダ/レスポンスヘッダを確認する。という手もあるでしょう。
>瀬戸っぷさん
リクエストに以下のようにKeep-Aliveの設定をしましたが問題は解決できてなかったです。
"GET %s HTTP/1.1\r\n"
"Host: %s\r\n"
"Accept: text/html\r\n"
"Accept-Charset: Shift-JIS\r\n"
"Accept-Language: ja\r\n"
"Connection: Keep-Alive\r\n"
"\r\n"
受信したヘッダを調べてみると、自分のPCで1回目に受信したヘッダには
Connection: close
と書かれていました。切断されてしまったようです。
大学のPCでは
Connection: keep-alive
と書かれていました。
推測ですが、サーバ側かプロキシが対応してなかったりするとKeep-Aliveが使えないということでしょうか?
Wiresharkでウェブプラウザの通信を調べてもKeep-Alive出来てなかったのでこういうものだと解釈しました。
皆さんご回答ありがとうございました。
ツイート | ![]() |