プロキシを使用して HTTP 経由で RTSP ストリームを取得しようとしています。リアル クライアントの動作は少し多忙のようです。考えられるすべてのポート、メソッド、およびプロトコルを一度に試します。ポート 80 を介した HTTP GET だけが動作するはずです。このような要求は実際に発行され、サーバーで受信されます。プロキシによってサーバーに送信されたときのリクエストは次のようになります。
GET /SmpDsBhgRl83c52ef2-d0f4-41ac-bada-93e5350f67d1?1="1" HTTP/1.0\r\n
Connection: Keep-Alive\r\n
Host: 10.194.5.162:80\r\n
Pragma: no-cache\r\n
User-Agent: RealPlayer G2\r\n
Expires: Mon, 18 May 1974 00:00:00 GMT\r\n
Accept: application/x-rtsp-tunnelled, */*\r\n
ClientID: WinNT_5.1_6.0.14.806_RealPlayer_R41UKD_en-GB_686\r\n
X-Actual-URL: rtsp://10.194.5.162:554/01.mp3\r\n
\r\n
サーバーの応答は次のとおりです。
HTTP/1.0 200 OK\r\n
Server: RMServer 1.0\r\n
Expires: Mon, 18 May 1974 00:00:00 GMT\r\n
Pragma: no-cache\r\n
x-server-ipaddress: 10.194.5.162\r\n
Content-type: audio/x-pn-realaudio\r\n
\r\n
この時点で、さらに 4 バイトがサーバーから到着します (値は 48 02 02 00 です)。それだけです。この時点で、サーバーはクライアントから何かを期待していますか? もしそうなら、何を期待していますか? この操作モードはまったく機能しますか?
この問題に関する追加情報: どうやら、RealPlayer に組み込まれている HTTP 経由で RTSP を使用する意図されたメカニズムは次のとおりです。
- 次のポートに接続してみてください: 80、8080、554、7070。
- 上記のポートごとに、2 つの接続を作成します。
- URL http://hostname:port/SmpDsBhgRl
<guid>
?1="1"への接続の 1 つに GET 要求を送信します。ここ<guid>
で、はい、新しく作成された GUID です。このリクエストに、元の RTSP URL を含む X-Actual-URL というヘッダーを追加します。 - 要求の本文の一部として上記の GUID を使用して、他の接続で URL http://hostname:port/SmpDsBhgRlに POST 要求を送信します。プロキシが途中で接続を閉じるのを防ぐために、32767 バイトの Content-Length ヘッダーを送信します。
- POST リクエストを通じてサーバーへのコマンドの発行を開始し、対応する RTSP ストリームを GET レスポンスの一部として取得します。
たとえば、Squid では動作しますが、ポート 3128 または 8080 のいずれかを使用すると動作しません! どういうわけか、クライアントは接続先のポートを使用して、リクエストの順序やリクエストをいつキャンセルするかを決定しますが、とにかく、信じがたいことですが、プロキシポート 9090、3129、8081 で動作しますが、 3128 または 8080 ではありません。
更新 #2: RealPlayer のソースと上記の動作の説明を次に示します。それでも解決策はありません。
更新 #3: OK、上記に照らして、48 02 02 00 のマジック値は明らかです: 48 == 'h' はHTTP_RESPONSE
、次の 02 は次のデータの長さ、次の 02 は呼び出されますPOST_NOT_RECEIVED
( POST リクエストが、対応する GET リクエストから 1 秒以内にサーバーに到達しなかったことを意味します)。
更新 #4: この動作 (つまり、巨大な Content-Length を持つ POST 要求) は、WebEx (および、サーバーへのオープン チャネルを必要とする他の多くの Web アプリ) で使用される ActiveX の特徴でもあります。