HTTP 経由でデータをストリーミングする単純な C++ アプリケーションを作成しました。ブラウザでサーバーの IP とポートを開くと、ブラウザ ウィンドウにストリームが表示されます。ただし、ブラウザーから C++ サーバーに対して行われた XHR 要求は、ヘッダーを受信した直後にクライアント側から自動的に閉じられます。スクリプトなしで TELNET や PHP、またはブラウザを使用しても、問題なくストリーム データが得られます。Ajax をダミー ストリームを生成する PHP スクリプトに接続することも機能します。
この問題の原因は何ですか? 送信された最初のバイトが '\0' であることが原因でしょうか? それとも、使用されているポートが 80 ではないことが原因でしょうか?
C++ サーバーと PHP スクリプトは、どちらも同じ Debian Linux マシンで実行されています。JS スクリプトは、Opera、Mozzila Firefox、Chrome など、複数のブラウザーでテストされています。
サーバーはこれらのヘッダーを送信します。
write(*con, "HTTP/1.1 200 OK\n",16);
write(*con, "X-Powered-By: Darker\n",21);
write(*con, "Pragma: no-cache\n",17);
write(*con, "Content-Type: text/plain; charset=\"utf-8\"\n",42);
write(*con, "Connection: keep-alive\n",23);
OK、Wireshark と Opera DragonFly の助けを借りて、発生するいくつかの問題を分離しました。
- HTTPRequest の "responseText" は常に "" (空の文字列) ですが、Wireshark ではデータが適切に受信されていることが簡単にわかります。
- ストリームがサーバー側から終了していなくても、応答を受信すると、「readyState」は常に 4 です。