我正在使用libevent来处理一组端口上的数据收据。我想完成的行为是:
- ay我有一组端口,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);
}
然后我给了一个读回调:
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!
看起来您只是在禁用插座上的读取数据,但这不会阻止某人在该套接字上向您发送数据(OS将从中缓冲大量数据它们是因为它假设有时间时您需要阅读)。
您不能阻止它们发送数据,但是您可以停止对这些端口的新连接(通过不接受阻塞端口上的连接,直到您想再次到达),并且您可以在封闭的端口上关闭连接向您发送数据(这意味着您仍然想在这些端口上阅读,但是如果它们向您发送任何东西,则您可以close()
或类似的内容。)