void on_process_packet(struct connection *c,rpacket_t r) { uint32_t coro_id = rpacket_read_uint32(r); const char *function_name = rpacket_read_string(r); int32_t arg1 = rpacket_read_uint32(r); int32_t arg2 = rpacket_read_uint32(r); uint32_t i = 0; wpacket_t w = wpacket_create(SINGLE_THREAD,wpacket_allocator,64,0); wpacket_write_uint32(w,coro_id); if(strcmp(function_name,"sum") == 0) wpacket_write_uint32(w,arg1+arg2); else wpacket_write_uint32(w,arg1*arg2); assert(w); connection_send(c,w,NULL); rpacket_destroy(&r); }
const void* rpacket_read_binary(rpacket_t r,uint32_t *len) { void *addr = 0; uint32_t size = 0; if(r->raw) return rpacket_raw_read_binary(r,len); size = rpacket_read_uint32(r); *len = size; if(!r->data_remain || r->data_remain < size) return addr; if(r->readbuf->size - r->rpos >= size) { addr = &r->readbuf->buf[r->rpos]; r->rpos += size; r->data_remain -= size; if(r->rpos >= r->readbuf->size && r->data_remain) { //当前buffer数据已经被读完,切换到下一个buffer r->rpos = 0; r->readbuf = buffer_acquire(r->readbuf,r->readbuf->next); } } else { //数据跨越了buffer边界,创建binbuf,将数据拷贝到binbuf中 if(!r->binbuf) { r->binbufpos = 0; r->binbuf = buffer_create_and_acquire(r->mt,NULL,r->len); } addr = r->binbuf->buf + r->binbufpos; while(size) { uint32_t copy_size = r->readbuf->size - r->rpos; copy_size = copy_size >= size ? size:copy_size; memcpy(r->binbuf->buf + r->binbufpos,r->readbuf->buf + r->rpos,copy_size); size -= copy_size; r->rpos += copy_size; r->data_remain -= copy_size; r->binbufpos += copy_size; if(r->rpos >= r->readbuf->size && r->data_remain) { //当前buffer数据已经被读完,切换到下一个buffer r->rpos = 0; r->readbuf = buffer_acquire(r->readbuf,r->readbuf->next); } } } return addr; }