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); } } }