static void handle_request(struct bufferevent* bev, void* arg) { size_t len; paxos_msg msg; struct evproposer* p = arg; struct evbuffer* in = bufferevent_get_input(bev); while ((len = evbuffer_get_length(in)) > sizeof(paxos_msg)) { //如果buffer中的数据数量大于一定,开始处理 evbuffer_copyout(in, &msg, sizeof(paxos_msg)); //判断一下,如果大小还小于消息大小,说明未传输完成,返回,否则处理消息 if (len < PAXOS_MSG_SIZE((&msg))) return; proposer_handle_msg(p, bev); } }
static void handle_request(struct bufferevent* bev, void* arg) { size_t len; paxos_msg msg; struct evproposer* p = (struct evproposer*)arg; struct evbuffer* in = bufferevent_get_input(bev); /*读取触发的消息,循环读取,防止粘包*/ while ((len = evbuffer_get_length(in)) > sizeof(paxos_msg)){ evbuffer_copyout(in, &msg, sizeof(paxos_msg)); if(len >= PAXOS_MSG_SIZE((&msg))){ proposer_handle_msg(p, bev); } } }
static void on_read(struct bufferevent* bev, void* arg) { size_t len; paxos_msg msg; struct evbuffer* in; struct tcp_receiver* r = (struct tcp_receiver *)arg; /*读取paxos msg,可能是多个*/ in = bufferevent_get_input(bev); while((len = evbuffer_get_length(in)) > sizeof(paxos_msg)){ evbuffer_copyout(in, &msg, sizeof(paxos_msg)); if (len < PAXOS_MSG_SIZE((&msg))) return; r->callback(bev, r->arg); } }