示例#1
0
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);
}
示例#2
0
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;
}