0

チャンク転送エンコーディング ストリーミング (つまり、HTTP 経由のビデオ ストリーム) を取得するために、http サーバーに要求を送信する http クライアントを (TCPClient から継承して) 実装する私のプログラム。

クライアントとサーバー間の接続を監視するために、同じソケットに null バイト (0x00) を書き込もうとするバックグラウンド スレッドを開始し、それに応じて接続の問題を検出します (ここで推奨されているように):

while (Client != null && Client.Send(ping) > 0)
    Thread.Sleep(2000);

2 つのスレッドからの書き込みの影響は、Wire-shark では、次のように ping と HTTP 要求が同じパケットに含まれていることがあります。

00 10 18 8d 23 ab 00 11 5d b9 e8 00 08 00 45 00  ....#...].....E.
00 b1 38 21 40 00 3e 06 77 de 0a 3f 03 3d 0a 3f  ..8!@.>.w..?.=.?
74 8d 89 7f 00 50 6b c3 45 a8 9f 76 4a 88 80 18  t....Pk.E..vJ...
13 5d a9 ad 00 00 01 01 08 0a 9c ea b6 a5 00 06  .]..............
9f 8b 47 45 54 20 2f 73 74 72 65 61 6d 2f 31 2f  ..GET /stream/1/
45 76 65 6e 74 41 20 48 54 54 50 2f 31 2e 31 0d  EventA HTTP/1.1.

もちろん、サーバーはこのパケットを無視し、http 要求を認識できません。

ソケットに書き込み、Send メソッドを使用して 1 つのパケットで送信されるようにする方法はありますか?

[編集]

DavidとTASの回答からわかるように、それは不可能です。そして、これは TCP が意図した動作でさえありません。

4

2 に答える 2

1

接続を監視しません。試してみて、成功するか失敗するかを確認してください。私を信じてください、あなたがやろうとしていることはあなたに苦痛を与えるだけです. もう一方の端は、送信しているゼロバイトをどうするかわかりません。

于 2013-10-27T14:15:22.473 に答える
0

あなたのアプローチには 1 つの問題があります。あなたのように Web サーバーにデータを書き込むことは、HTTP に違反しており、サーバーがクラッシュしたり、接続が切断されたりする可能性があります。

実装しているクライアントは、サーバーから継続的にデータを読み取ります。read の呼び出しは、サーバーが接続を閉じたかどうか、またはタイムアウトが発生した場合に例外をスローしたかどうかを示します。後者は通常、何らかのネットワークの問題が発生した場合に発生します。これは、Web サーバーが接続を適切に閉じるためです。

更新: クライアントで転送を一時停止しても、サーバーがチャンクの送信を続行するのは停止しません。データが受信されない場合、基礎となる OS バッファーがいっぱいになり、最終的にパケットがドロップされます。最終的な結果として、ネットワークに何らかの問題があるとサーバーが判断したため、サーバーが接続を閉じる可能性があります。

1 つの解決策は、チャンクの読み取りを続行し、後で再生するためにそれらをバッファーに格納することです。十分なメモリが利用できない場合は、接続を閉じて、ユーザーが再開したときに再接続します。

于 2013-10-27T14:12:41.553 に答える