1

一連のポートでのデータ受信を処理するためにlibeventを使用しています。私が達成したい動作はこれです:

-ポートのセット、1001-1004があるとします。-1001などのポートでデータを読み込みます。-コールバックがヒットしたらすぐに、このポート(1001)でそれ以上の読み取りを無効にします。-すべてのポートがデータを受信したら、読み取りのためにすべてをオンに戻します。

今、私はbuffereventsの構造体を持っています:

static struct bufferevent *bev[4];

ドキュメントに示されているようにリスナーを設定しました。

/* Listener 1 */
sin.sin_port = htons(MIXPORT + 1);
listener1 = evconnlistener_new_bind(base, accept1, NULL,
    LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1,
    (struct sockaddr*)&sin, sizeof(sin));
if (!listener1) { perror("Couldn't create listener1"); return 1; }
evconnlistener_set_error_cb(listener1, accept_error_cb);

static void accept1(struct evconnlistener *listener,
evutil_socket_t fd, struct sockaddr *address, int socklen,
void *ctx) {
/* A new connection was received on this port */
struct event_base *base = evconnlistener_get_base(listener);
bev[0] = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);

/* Callback for when (*bufevent, data READ, data WRITTEN, event OCCURRED, *void) */
bufferevent_setcb(bev[0], read1, NULL, echo_event_cb, NULL);

/* Set bufferevent to be able to read */
bufferevent_enable(bev[0], EV_READ);
}

それから私はそれにREADコールバックを与えました:

static void read1(struct bufferevent *bev, void *ctx) {
if(LOG) { logoutput("Data received on port 1"); }

struct evbuffer *input = bufferevent_get_input(bev);
size_t len = evbuffer_get_length(input);
data[0] = malloc(len);

/* Copy evbuffer data into array */
evbuffer_copyout(input, data[0], len);
/* Remove data from evbuffer after copying it out */
evbuffer_drain(input, len);

handle(0);
}  

私の「ハンドル」関数で、これを行うように指示しました。

static void handle(int i)
{
/* Disable reading on port until re-enabled later */
bufferevent_disable(bev[i], EV_READ);  // I thought this should do it?!

// Do other stuff...
random_function();
}

そして最後に...

static void random_function(); {
/* Re-enable read on port */
    bufferevent_enable(bev[src], EV_READ);
}

私が間違っていることについて何か考えはありますか?ランダムなポートにデータを送信した場合でも、さらに多くのデータを送信できます。
TIA!

4

1 に答える 1