0

LinuxでC言語でプロキシサーバーを作成しようとしています。ストリーミングメディアで試してみるまでは、問題なく機能していました(問題なく機能していると感じていました)。

Lemmeは最初に問題を伝え、次にストリーミングメディアにジャンプします。ウェブサイトからの受信データを読み取り、それを実際のクライアントに転送するには、これを行います

count = read(websitefd,buffer,BUFSIZ);

write(clientfd,buffer,count);` 

そのソケット上のすべてのデータを読み取るまで、継続的なwhileループで。

問題は、実際のWebサイトがコンテンツ長フィールドが1025バイトのHTTPパケットを送信し、他のパケットのデータの他の部分を送信する場合でも、常にBUFSIZ(8192バイト)を待ってから、8192バイトをすべて一緒にクライアントマシンに送信することです。 。octet-stream通常の場合、実際のサーバーと同じようにパケットを転送する必要があるため、正しい方法ではないことがわかっていても、正常に機能します。したがって、実際のサーバーが1024バイトと1024バイトのサイズの2つのパケットを送信する場合、コンテンツの長さが900バイト(残りはすべてhttpヘッダーであると想定)であると言うHTTPヘッダーを持つ最初のパケットを含む2048バイトのパケットをクライアントに送信しますが、実際には2048バイトのパケットをクライアントに転送します。コンテンツタイプの場合:application / octet-streamは、すべてをダウンロードして、画像またはHTMLテキストとして表示するか、保存するように要求します。

クライアントがストリーミングメディアを要求した場合、上記の理由により、クライアントはビデオを再生できません。だから私は今何をすべきですか?私の質問を読んでくれてありがとう。私を助けてください。:)

4

2 に答える 2

3

まず、既存のプロキシサーバーをプロキシシステムのベースとして使用することを強くお勧めします。HTTP標準は非常に複雑で、想像以上に複雑です。プロキシサーバーを実装する場合は、最初にRFC2616を少なくとも3回読んでください。

次に、プロキシサーバーはHTTPヘッダーを解析して、送信する必要のある量を把握する必要があります。送信するデータ量を知るための3つの主な方法は次のとおりです。

  • Content-Lengthヘッダーが存在し、ヘッダーが存在しない場合Transfer-Encoding:ヘッダーはContent-Length、中継するデータの量をバイト単位で指定します。ループコピーに入るだけです。
  • ヘッダーが存在する場合:チャンク転送エンコーディングチャンクヘッダーをTransfer-Encoding: chunked解析する必要があります。このエンコーディングは、合計サイズが事前にわからないストリーミングデータに頻繁に使用されます。また、スクリプトによって生成される動的データにもよく使用されます。
  • 他のTransfer-Encodingヘッダーが存在する場合:そのエンコーディングが何であるかを知らない限り、接続を閉じて500エラーを報告します。
  • Content-Lengthヘッダーが存在せず、ヘッダーが存在しない場合Transfer-EncodingConnection: close(HTTP / 1.1では存在する必要があります)およびConnection: keep-alive(HTTP / 1.0では存在しない必要があります)を確認します。これらの条件に違反した場合は、500エラーをトリガーします。それ以外の場合は、サーバーが接続を閉じるまでデータを渡し続けます。

私は意図的にこれを少し大げさにしています-プロキシサーバーを最初から実装する場合は、標準を読む必要があります。そうしないと、ブラウザの非互換性やセキュリティホールが確実に発生します。ですから、そうしないでください。コアプロキシサーバーとしてlighttpdvarnishなどを使用し、必要な機能のプラグインを作成するだけです。

于 2011-02-25T15:59:07.790 に答える
1

メディアはチャンクで転送されると思います。つまり、Content-Lengthが存在せず、データは終了するまで送信されます。bdonlanが言ったように、チャンク化されたデータがどのように機能するかを読んでください。

そして私はHTTPがかなり厄介であることに同意します(時間の多くの変更と解釈のために)

于 2011-02-25T16:07:11.037 に答える