私はこの方法でlibeventで(大きなファイルの)チャンク応答を実行しようとしています::
evhttp_send_reply_start(request, HTTP_OK, "OK");
int fd = open("filename", O_RDONLY);
size_t fileSize = <get_file_size>;
struct evbuffer *databuff = NULL;
for (off_t offset = 0;offset < fileSize;)
{
databuff = evbuffer_new();
size_t bytesLeft = fileSize - offset;
size_t bytesToRead = bytesLeft > MAX_READ_SIZE ? MAX_READ_SIZE : bytesLeft;
evbuffer_add_file(databuff, fd, offset, bytesToRead);
offset += bytesToRead;
evhttp_send_reply_chunk(request, databuff); // send it
evbuffer_free(databuff); // destroy it
}
evhttp_send_reply_end(request);
fclose(fptr);
問題はこれにあります。add_fileが非同期であると感じているので、3番目かそこらevhttp_send_reply_chunk
でエラー(または同様のもの)が発生します。
[警告]evhttp_send_chainClosed(45):不正なファイル記述子
チャンク転送エンコーディングを実際にテストするMAX_READ_SIZE
ように設定しました。8
使用できる方法があることに気づきましたが、evhttp_request_set_chunked_cb (struct evhttp_request *, void(*cb)(struct evhttp_request *, void *))
使用方法の例が見つかりませんでした。
たとえば、コールバックに引数を渡すにはどうすればよいですか?引数は、要求ハンドラーに渡されたものと同じ引数のようですが、送信するファイル記述子とファイルオフセットを保持するオブジェクトを作成したいので、必要なものではありません。
すべての助けに感謝します。
よろしくお願いしますスリ