0

C# でソケットを使用して HTTP を練習していますが、次のコードで応答本文を取得できます。

int bytes = 0;
while (bytes > 0)
{
    bytes = HttpSocket.Receive(RecieveBytes, RecieveBytes.Length, 0);
    Response.Body = Response.Body + Encoding.ASCII.GetString(RecieveBytes, 0, bytes);
}

Response.Body を読むと、HTML コードしか含まれていません。(体)。

より多くの情報を入手するにはどうすればよいですか? 応答ヘッダーが好きですか? 私はすでにいくつかのグーグルを行いましたが、明確な答えはありません。

注: HttpWebRequest があるため、C# で HTTP 用のクラスまたはフレームワークを作成しても意味がないことはわかっています。しかし、私は学習目的でこれを行っています。

スウェン

4

3 に答える 3

2

HTTP 応答本文のみを受信Socket.Receive()し、サーバーが送信した利用可能なすべてのバイトを受信するということはあり得ないため、応答ヘッダーもそこにある必要があります (一般的な Web サーバーと通信していて、有効なリクエスト)。Fiddlerなどのツールを使用して、要求と応答のペアを監視し、応答が で始まることを確認しHTTP/1.1 200 OKます。

すべてのヘッダーが送信されたことを示すReceive()double を受信するまで呼び出すことができます。\r\nそこから、RFC 2616 セクション 4.4を実装して、(存在する場合) メッセージ本文データをどれだけ読み取るかを決定する必要があります。

最も一般的なのはContent-length、 double の後に読み取る必要があるバイト数を示す応答ヘッダーです\r\n。そのヘッダーが存在しない場合 (または、リクエスト メソッドがHEADであった場合、メッセージ本文がないため、読み取りを停止する必要があります) で、他のメッセージ長のケースのいずれも適用されない場合、これでデータの読み取りが完了します。Receive()これ以上データを取得しようとしないでください。

しかし、それが学習目的である場合は、RFC を見つけて実装する必要があります。データを読みに行って、それがうまくいくことを期待することはできません。それがプロトコルの目的です。

于 2012-07-25T15:02:00.353 に答える
0

これは、HTTP を処理する最良の方法ではありません。このSocketクラスは raw バイトで動作しますが、HTTP ヘッダーは代わりにテキスト行で動作します。空白行に遭遇するまでループ内でテキスト行を読み取り、次にヘッダーを処理して、残りの生バイトがある場合はその読み取りを終了する方法を決定する必要があります。NetworkStreamそのためのとStreamReaderクラスを見てください。より良いオプションは、HttpClient代わりにクライアント クラスを使用して、これらすべての詳細を処理させることです。

于 2012-07-26T03:42:20.090 に答える
0

「bytes」は最初はゼロであり、正の間だけループするため、while ループは決して実行されません。

于 2012-07-26T02:16:07.907 に答える