static inline void start_recv(struct connection *c) { if(test_recvable(c->status)){ c->unpack_buf = buffer_create_and_acquire(NULL,BUFFER_SIZE); c->next_recv_buf = buffer_acquire(NULL,c->unpack_buf); c->wrecvbuf[0].iov_len = BUFFER_SIZE; c->wrecvbuf[0].iov_base = c->next_recv_buf->buf; c->recv_overlap.m_super.iovec_count = 1; c->recv_overlap.m_super.iovec = c->wrecvbuf; c->last_recv = GetSystemMs64(); Post_Recv(c->socket,&c->recv_overlap.m_super); } }
int32_t connection_start_recv(struct connection *c) { if(c->unpack_buf) return -10; c->unpack_buf = buffer_create_and_acquire(c->mt,NULL,BUFFER_SIZE); c->next_recv_buf = buffer_acquire(NULL,c->unpack_buf); c->next_recv_pos = c->unpack_pos = c->unpack_size = 0; c->wrecvbuf[0].iov_len = BUFFER_SIZE; c->wrecvbuf[0].iov_base = c->next_recv_buf->buf; c->recv_overlap.m_super.iovec_count = 1; c->recv_overlap.isUsed = 1; c->recv_overlap.m_super.iovec = c->wrecvbuf; return Post_Recv(c->socket,&c->recv_overlap.m_super); }
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); } } } }