Example #1
0
static void IoFinish(handle *sock,void *_,int32_t bytes,int32_t err_code,int32_t recvflags)
{
	int32_t unpack_err;
	datagram *d = (datagram*)sock;	
	if(bytes > 0 && recvflags != MSG_TRUNC){
		update_next_recv_pos(d,bytes);
		packet *pk = d->decoder_->unpack(d->decoder_,&unpack_err);
		if(pk){
			d->on_packet(d,pk,&d->recv_overlap.addr);
			packet_del(pk);
			if(((socket_*)d)->status & SOCKET_CLOSE)
				return;
		}
	}
	PostRecv(d);
}
Example #2
0
void RecvFinish(int32_t bytestransfer,struct connection *c,uint32_t err_code)
{
	uint32_t recv_size;
	uint32_t free_buffer_size;
	buffer_t buf;
	uint32_t pos;
	int32_t i = 0;
	do{
		if(bytestransfer == 0)
			return;
		else if(bytestransfer < 0 && err_code != EAGAIN){
			//printf("recv close\n");
            if(c->status != SCLOSE){
                c->status = SCLOSE;
                CloseSocket(c->socket);
                //被动关闭
                c->cb_disconnect(c,err_code);
			}
			return;
		}else if(bytestransfer > 0){
			int32_t total_size = 0;
			do{
				c->last_recv = GetSystemMs64();
				update_next_recv_pos(c,bytestransfer);
				c->unpack_size += bytestransfer;
				total_size += bytestransfer;
				if(!unpack(c)) return;
				buf = c->next_recv_buf;
				pos = c->next_recv_pos;
				recv_size = BUFFER_SIZE;
				i = 0;
				do
				{
					free_buffer_size = buf->capacity - pos;
					free_buffer_size = recv_size > free_buffer_size ? free_buffer_size:recv_size;
					c->wrecvbuf[i].iov_len = free_buffer_size;
					c->wrecvbuf[i].iov_base = buf->buf + pos;
					recv_size -= free_buffer_size;
					pos += free_buffer_size;
					if(recv_size && pos >= buf->capacity)
					{
						pos = 0;
						if(!buf->next)
							buf->next = buffer_create_and_acquire(NULL,BUFFER_SIZE);
						buf = buf->next;
					}
					++i;
				}while(recv_size);
				c->recv_overlap.m_super.iovec_count = i;
				c->recv_overlap.m_super.iovec = c->wrecvbuf;
				if(total_size >= BUFFER_SIZE)
				{
					Post_Recv(c->socket,&c->recv_overlap.m_super);
					return;
				}
				else
					bytestransfer = Recv(c->socket,&c->recv_overlap.m_super,&err_code);
			}while(bytestransfer > 0);
		}
	}while(1);
}
Example #3
0
void RecvFinish(int32_t bytestransfer,st_io *io)
{
	struct OVERLAPCONTEXT *OVERLAP = (struct OVERLAPCONTEXT *)io;
	struct connection *c = OVERLAP->c;
	uint32_t recv_size;
	uint32_t free_buffer_size;
	buffer_t buf;
	uint32_t pos;
	int32_t i = 0;
	uint32_t err_code = io->err_code;
	for(;;)
	{
		if(bytestransfer == 0 || (bytestransfer < 0 && err_code != EAGAIN))
		{
			printf("recv close\n");
			c->recv_overlap.isUsed = 0;
			c->is_close = 1;
			if(!c->send_overlap.isUsed)
			{
				//-1,passive close
				c->_on_disconnect(c,-1);
			}
			break;
		}
		else if(bytestransfer < 0 && err_code == EAGAIN)
		{
			break;
		}
		else
		{
			int32_t total_size = 0;
			while(bytestransfer > 0)
			{
				c->last_recv = GetCurrentMs();
				//total_size += bytestransfer;
				update_next_recv_pos(c,bytestransfer);
				c->unpack_size += bytestransfer;
				total_size += bytestransfer;
				unpack(c);
				buf = c->next_recv_buf;
				pos = c->next_recv_pos;
				recv_size = BUFFER_SIZE;
				i = 0;
				while(recv_size)
				{
					free_buffer_size = buf->capacity - pos;
					free_buffer_size = recv_size > free_buffer_size ? free_buffer_size:recv_size;
					c->wrecvbuf[i].iov_len = free_buffer_size;
					c->wrecvbuf[i].iov_base = buf->buf + pos;
					recv_size -= free_buffer_size;
					pos += free_buffer_size;
					if(recv_size && pos >= buf->capacity)
					{
						pos = 0;
						if(!buf->next)
							buf->next = buffer_create_and_acquire(c->mt,NULL,BUFFER_SIZE);
						buf = buf->next;
					}
					++i;
				}

				c->recv_overlap.isUsed = 1;
				c->recv_overlap.m_super.iovec_count = i;
				c->recv_overlap.m_super.iovec = c->wrecvbuf;
								 
				if(total_size > 65536)
				{
					Post_Recv(c->socket,&c->recv_overlap.m_super);
					return;
				}
				else
					bytestransfer = Recv(c->socket,&c->recv_overlap.m_super,&err_code);
			}
		}
	}
}
Example #4
0
void RecvFinish(int32_t bytestransfer,st_io *io)
{
	struct OVERLAPCONTEXT *OVERLAP = (struct OVERLAPCONTEXT *)io;
	struct connection *c = OVERLAP->c;
	rpacket_t r;
	uint32_t recv_size;
	uint32_t free_buffer_size;
	buffer_t buf;
	uint32_t pos;
	int32_t i = 0;
	uint32_t err_code = io->err_code;
	for(;;)
	{
		if(bytestransfer == 0 || bytestransfer < 0 && err_code != EAGAIN)
		{
			c->recv_overlap.isUsed = 0;
			if(!c->send_overlap.isUsed)
			{
				if(c->is_close == 1)
				{
					printf("RecvFinish is_close\n");
					exit(0);
				}
				//-1,passive close
				c->_on_disconnect(c,-1);
			}
			break;
		}
		else if(bytestransfer < 0 && err_code == EAGAIN)
		{
			break;
		}
		else
		{
			while(bytestransfer > 0)
			{
				update_next_recv_pos(c,bytestransfer);
				c->unpack_size += bytestransfer;
				unpack(c);
				//while(r = unpack(c))
				//	c->_process_packet(c,r);
				//发起另一次读操作
				buf = c->next_recv_buf;
				pos = c->next_recv_pos;
				recv_size = BUFFER_SIZE;
				i = 0;
				while(recv_size)
				{
					free_buffer_size = buf->capacity - pos;
					free_buffer_size = recv_size > free_buffer_size ? free_buffer_size:recv_size;
					c->wrecvbuf[i].iov_len = free_buffer_size;
					c->wrecvbuf[i].iov_base = buf->buf + pos;
					recv_size -= free_buffer_size;
					pos += free_buffer_size;
					if(recv_size && pos >= buf->capacity)
					{
						pos = 0;
						if(!buf->next)
							buf->next = buffer_create_and_acquire(c->mt,NULL,BUFFER_SIZE);
						buf = buf->next;
					}
					++i;
				}

				c->recv_overlap.isUsed = 1;
				c->recv_overlap.m_super.iovec_count = i;
				c->recv_overlap.m_super.iovec = c->wrecvbuf;
				bytestransfer = WSARecv(c->socket,&c->recv_overlap.m_super,1,&err_code);
			}
		}
	}
}