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