4

libevent とその http API を使用して、C サーブレットを作成できる単純な HTTP サーバーを作成しています。このサーブレットは GET で問題なく動作していますが、現在 POST でデータを送信しており、受信イベント バッファ evb を読みたいと考えています。evb に存在するデータを印刷/検査したいのですが、できません。データを evb (evbuffer) の char* 変数に入れる方法を知っていますか? バッファを操作するメソッドのみを見ましたが、それを読み取っていませんでした。私は試した:

evb->

これはコードです:

    #include <stdio.h>
    #include "servlet.h"

    void servlet(struct evhttp_request *req, struct evbuffer *evb) {
        time_t now;
        time(&now);
        evbuffer_add_printf(evb, "<html>\n <head>\n"
            "  <title>%s</title>\n"
            " </head>\n"
            " <body>\n"
            "  <h1>%s</h1>\n"
            " <p>Current time is: %s</p>",
            "C servlet engine", "C servlet", ctime(&now));
        evhttp_add_header(evhttp_request_get_output_headers(req),
            "Content-Type", "text/html");
        evhttp_send_reply(req, 200, "OK", evb);
    }

I am trying this 

void servlet(struct evhttp_request *req, struct evbuffer *evb) {
    size_t len = evbuffer_get_length(evhttp_request_get_input_buffer(req));
    struct evbuffer *in_evb = evhttp_request_get_input_buffer(req);
    char *data;
    evbuffer_copyout(in_evb, data, len);

しかし、私はバスエラーを受け取ります: 10 (私はMacを使用しています)

4

3 に答える 3

3

使いたいそうです

ev_ssize_t evbuffer_copyout(struct evbuffer *buf, void *data, size_t datalen)

datalenバッファの内容 (最大バイト数) をメモリ領域にコピーしますdatalibevent bookに記載されています

于 2012-08-10T15:00:42.033 に答える
2

here's a method that works:

static void echo_read_cb(struct bufferevent *bev, void *ctx)
{
/* This callback is invoked when there is data to read on bev. */
struct evbuffer *input = bufferevent_get_input(bev);
struct evbuffer *output = bufferevent_get_output(bev);

size_t len = evbuffer_get_length(input);
char *data;
data = malloc(len);
evbuffer_copyout(input, data, len);

printf("we got some data: %s\n", data);

/* Copy all the data from the input buffer to the output buffer. */
evbuffer_add_buffer(output, input);
free(data);
}
于 2015-06-04T09:19:14.880 に答える