Poco を使用して、クライアントの要求に応じて jpeg フレームを送信する AXIS カメラ Web サーバーをエミュレートしようとしています。
各 Web 応答は、Content-Type: multipart/x-mixed-replace と定義済みの境界でエンコードする必要があります。
どうすればポコでできますか? ありがとう。
Poco を使用して、クライアントの要求に応じて jpeg フレームを送信する AXIS カメラ Web サーバーをエミュレートしようとしています。
各 Web 応答は、Content-Type: multipart/x-mixed-replace と定義済みの境界でエンコードする必要があります。
どうすればポコでできますか? ありがとう。
response.setContentType()は正しいですが、sendBuffer ()を作成すると、Poco は定義済みの境界文字列を各境界ブロックの上部に配置しません。
チャンク転送を避けるためにsetChunkedTransferEncoding()をfalseに指定することが重要です。これは私が求めているものではありません。
私が必要とするのはこれです: http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
これが私のデータ バッファの場合: 「これは最初の境界ブロックです。境界ブロックは次のブロックに続く可能性があります。これは 2 番目の境界ブロックです。」
これは私が実装する必要があるものです:
HTTP/1.1 200 OK
Date: Tue, 01 Dec 2013 10:27:30 GMT
Content-Length: 117
Content-Type: Multipart/mixed; boundary="sample_boundary";
--sample_boundary
This is the first boundary block. A boundary block may
--sample_boundary
continue in the next block. This is the second boundary block.
それをいじってみると、目的の境界を取得するには、バッファを手動で分割する必要があることがわかりました。
これは私が実際に行う方法です:
std::ostream& ostr = response.send();
char frameBuffer[102410];
char fragment[1024];
string boundary = "--BOUNDARY--";
response.setChunkedTransferEncoding(false);
response.setContentType("multipart/x-mixed-replace; boundary=" + boundary);
//Split my frameBuffer in some fragments with boundary
unsigned int nBytes = sizeof(frameBuffer);
unsigned int _MAX_FRAGMENT_SIZE_ = sizeof(fragment);
unsigned int index=0;
response.setContentLength(frameLength);
while (nBytes>0){
unsigned int size = (nBytes>_MAX_FRAGMENT_SIZE_)?_MAX_FRAGMENT_SIZE_:nBytes;
memcpy(fragment, frameBuffer + index, size);
//Enviamos el fragmento sin mas con su boundary correspondiente.
ostr << boundary << "\r\n";
ostr.write(fragment, size);
ostr << "\r\n";
index += size;
nBytes -= size;
}
Pocoにはそれを解決するツールがあると思いました。ありがとう
これらの行に沿って何かを行う必要があります:
using Poco::Net::HTTPRequestHandler;
using Poco::Net::HTTPServerRequest;
using Poco::Net::HTTPServerResponse;
using Poco::Net::HTTPRequestHandlerFactory;
using Poco::Net::HTTPServerParams;
using Poco::Net::HTTPServer;
using Poco::Net::ServerSocket;
using Poco::Net::SocketAddress;
struct AXISRequestHandler: public HTTPRequestHandler
{
void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
{
// ... get data to send back
response.setContentType("multipart/x-mixed-replace; boundary=--MY_BOUND");
response.sendBuffer(data, size);
}
};
struct AXISRequestHandlerFactory: public HTTPRequestHandlerFactory
{
HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request)
{
return new AXISRequestHandler;
}
};
ServerSocket svs(SocketAddress("192.168.0.1", 8080));
HTTPServerParams* pParams = new HTTPServerParams;
// ... set server params here to your liking
HTTPServer srv(new AXISRequestHandlerFactory, svs, pParams);
srv.start(); // NB: server will fly off here (to its own thread)