tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSocketを用いて得たデータからのヘッダ部取り除きについて
記事No3179
投稿日: 2006/02/24(Fri) 22:15
投稿者ねご
[OSのVer]:WindowsXP media center edition [VBのVer]:VB2005(MSDNなし)

はじめましてねごといいます。

WindowsXP(MediaCenterEdition)sp2
VisualBasic2005 professional(MSDNなし。)←.net spokepremiumからのバージョンアップ
を用いて製作しています。

webcliantを用いてファイルをダウンロードしていたところ
配布先のコンピューターでセキュリティーにはじかれて
ダウンロードできないと報告を受け、現在socketを用いる方法に切り替えています。
が、socketで受信できるデータにはヘッダが含まれており、どうしてもこれが取り除けません。

Socketクラスを使ってHTTPサーバーにGET要求し、応答を受信するサンプル
hhttp://dobon.net/vb/dotnet/internet/downloadusesocket.html

を参考にして、データを受信し、

受信したデータから我流でヘッダ部分を取り除いた(かなり無理やりです。)のですが、
一部のデータでは成功するものの、
時にデータを取り除きすぎて正常にダウンロードされません。

いろいろ努力はしてみたものの
基礎知識の足りない現在の状態ではこれ以上自力で改善することができません。

以下に我流で考え出したヘッダ取り除きソースへのリンクを掲載させていただきますので
なぜ恒常的にではなく時々失敗するのか等
ご指導いただけますようお願いいたします。(見づらいソースで申し訳ございません。)

リンク
hhttp://kmuproject.hp.infoseek.co.jp/temp001.html

私のプログラム歴はローカルで動く簡単なプログラムを
指導書を見ながら作る程度であり、ご指導いただける際にできれば
解説サイト等ご存知でしたら教えていただければ幸いです。

*最初にVisual Basic 初心者掲示板の方に投稿させていただいたのですが、
 掲示板の容量不足のためか表示されませんでした。(スレッドは閉じておきました。)
 こちらを本スレッドとして扱ってください。
 マルチポストと誤解されないようにここに追記させていただきます。

[ツリー表示へ]
タイトルRe: Socketを用いて得たデータからのヘッダ部取り除きについて
記事No3181
投稿日: 2006/02/24(Fri) 23:21
投稿者YAS
ご質問に対する回答ではありません。

Webサーバとの交信が目的のライブラリは次のようなものがあります。
上に行くほど簡単・便利で下に行くほど原始的・基本的です。

1 WebBrowserクラス
2 WebClientクラス
3 HttpWebRequest/HttpWebResponseクラス
4 WebRequest/WebResponseクラス
5 Socketクラス

(3と4はあまりかわりませんが...)

5のSocketはめったに使うものではないと思いますが,
可能ならば3・4あたりをお試しになった方がよいのでは?

(また「セキュリティー」にはじかれてしまうかもしれませんが。)

[ツリー表示へ]
タイトルRe^2: Socketを用いて得たデータからのヘッダ部取り除きについて
記事No3185
投稿日: 2006/02/24(Fri) 23:36
投稿者ねご
ご回答ありがとうございます。

>可能ならば3・4あたりをお試しになった方がよいのでは?
説明不足で申し訳ございません。
ご提示いただいたクラスを用いたDownload関数も
もちろん作成し、実装させております。
(書籍 VisualBasic.NETネットワーク+データベース300の技 を参照させていただきました。)

それなのになぜわざわざSocketを用いてこんなことをしているのかといいますと、
ダウンロードがセキュリティーにはじかれる原因が理解できていないことにあります。

現状では私の努力範囲で知りうるダウンロード方法をすべて提供し、
どれか使えるものがないかユーザーに選択してもらうことで対処しようと考えており、
そのためにSocketクラスを用いたダウンロード方法も
同時に提供できればいいなと考えた次第であります。

説明が足りず申し訳ございませんでした。

[ツリー表示へ]
タイトルRe^3: Socketを用いて得たデータからのヘッダ部取り除きについて
記事No3190
投稿日: 2006/02/25(Sat) 12:03
投稿者YAS

SocketもWebClientも自分で手動でやるか,ライブラリが自動でやるかの違いだけで,
結局やることは同じなのでは?(少なくともサーバー側から見れば同じに見える
はずです。)
どんなセキュリティーかは存じませんが,禁じている行為がちょっとやり方を
変えるだけでできてしまうのなら,禁じている意味がありません。
ですから,(たぶんですが),どんな実装にしてもセキュリティーにははじかれると
思います。

変えるとしたら,ポートを変えるとか。(httpの80がだめならhttpsの443で試すとか)
Httpsでトンネルを掘れば,プロキシやファイアーウォールは回避できます。

でもセキュリティーを回避したり,破ったりするのははっきり言っておすすめしません。
システムの管理者が聞いたら激怒すること間違いなしです。

そのセキュリティーというのがただのウイルススキャンソフトにおまけの
パーソナルファイアーウォール程度のものなら設定を変えてもらう方がよいと思います。

[ツリー表示へ]
タイトルRe^4: Socketを用いて得たデータからのヘッダ部取り除きについて
記事No3193
投稿日: 2006/02/25(Sat) 13:24
投稿者ねご
レスに気づかず
遅い回答になってしまいました申し訳ございません。

> SocketもWebClientも自分で手動でやるか,ライブラリが自動でやるかの違いだけで,
> 結局やることは同じなのでは?(少なくともサーバー側から見れば同じに見える
> はずです。)

やっぱりそうなのでしょうか・・・
なんとなくそうなのではないかとは思ったのですが。

(通常のwebblowserなどからダイアログを表示してダウンロード等を行う分には
ひっかからないと伝えられていたものですから、素人考えで試してみたというのが実情です。)


>でもセキュリティーを回避したり,破ったりするのははっきり言っておすすめしません。
>システムの管理者が聞いたら激怒すること間違いなしです。

はい・・・。おっしゃるとおりです。(汗)
本来ならセキュリティーポリシーを変更してもらうようにしたいのですが
原因がわからないので変更の方法もわからない・・・。

>変えるとしたら,ポートを変えるとか。(httpの80がだめならhttpsの443で試すとか)
>Httpsでトンネルを掘れば,プロキシやファイアーウォールは回避できます。

ご指摘ありがとうございます。Httpsの意味さえ現在はわかりませんが、
どうしても原因がわからず八方塞となりましたらまた調べてみることといたします。

さまざまにご回答をいただき本当にありがとうございました。
YAS様の言うとおり、原因がわからないままにいろいろ試行してみても
サーバー様等に迷惑がかかりそうなので、まず原因をきちんと追究することにします。
(スレッドを変えたほうがいいのかもしれませんが、もしも、
 どなたか思い当たる原因等ございましたらご指摘いただければ幸いです。)

どの方法を用いても同じの可能性が高いのなら
わざわざ難しいSocketを使う必要もなさそうなのでやめておきます。

初心者の変な質問に付き合っていただきありがとうございました。

また機会がありましたらそのときは
どうぞよろしくお願いいたします。

[ツリー表示へ]
タイトルRe: Socketを用いて得たデータからのヘッダ部取り除きについて
記事No3183
投稿日: 2006/02/24(Fri) 23:27
投稿者YAS
HTTPプロトコルでは応答ヘッダと受信データの間には「空行」が必ず
あるはずだと思います。
つまり,

HTTP応答ヘッダ
空行
受信データ(テキストまたはバイナリ)

の順に送られてくるので,空行を検知できればヘッダとデータを分けられる
と思います。

(実はあまり上の情報には自信がありません。ご自分でお確かめの上,お試しください。)

[ツリー表示へ]
タイトルRe^2: Socketを用いて得たデータからのヘッダ部取り除きについて
記事No3189
投稿日: 2006/02/25(Sat) 02:36
投稿者ねご
ご回答ありがとうございます。

YAS様のおっしゃられるとおり
返ってくるデータには受信データの前に必ず空行があるようです。

まず、渡されたバイナリをすべて文字コードに変換し、
String型の変数に格納
それをControlChars.CrLfでSplitして
各配列の中身をチェック
文字が入っていなければその行が空白としました。
(実際は文字列比較がうまくいかなかったので、
 切り出し関数を使い、エラーが出たら空行としました。)

こうして空行の位置を取得したまではよかったのですが、
空行までのバイト数を求めて、(splitで作った配列を空行まで足しあわせる。)
差し引こうとすると、どうも最初の手順のエンコードで何かが変わっているようで
実際よりも10バイトほど小さな値がでて、
差し引いた結果、余計なヘッダのごみがファイルに残ってしまいます。

お教えいただいてからかなり試行錯誤していますが、
バイナリと文字列(エンコード)の壁は高いようです(汗)

見当違いのことをしていたら申し訳ございません。

取り急ぎ現在の状況をご報告して本日は休むことにいたします。

[ツリー表示へ]