ソケットを再利用

解決


たこVC  2011-06-11 09:16:31  No: 72714

開発環境
自分の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だと正常に動きます。
なぜこのようなことがおきるのでしょうか?

何が原因か分からないので分かる範囲の情報を書いてみます。

自分のネット環境はケーブルテレビでネット接続しています。
大学のネット環境は詳しくは分からないですがプロキシがありました。

ご教授お願いします。


  2011-06-11 18:36:03  No: 72715

大学のプロキシ経由使えないの?

あまり、地震のない答え・・・・・・


瀬戸っぷ  2011-06-12 21:12:48  No: 72716

HTTPなら…Keep-Aliveに設定していないとセーザ側からファイル送信がオワッタ後で切断される…かと。
http://d.hatena.ne.jp/dayflower/20081024/1224830945
とか。

接続先の対応状況によっては変わる…かもしれません。
# 今回の場合はプロキシが対応している可能性があるかと。

GET/POSTリクエストの際にConnetionヘッダを付与してみてはどうでしょうか?
http://www.studyinghttp.net/header#Connection


瀬戸っぷ  2011-06-13 20:21:21  No: 72717

>HTTPなら…Keep-Aliveに設定していないとセーザ側からファイル送信がオワッタ後で切断される…かと。

誤字がひどいっすな。
「サーバ側からファイル送信が終わった後で」です。
HTTP/1.1だと…未指定でも接続されたまま…なのかも知れません。

パケットキャプチャでリクエストヘッダ/レスポンスヘッダを確認する。という手もあるでしょう。


たこVC  2011-06-14 05:58:54  No: 72718

>瀬戸っぷさん
リクエストに以下のように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出来てなかったのでこういうものだと解釈しました。

皆さんご回答ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加