void SendFinish(int32_t bytestransfer,st_io *io) { struct OVERLAPCONTEXT *OVERLAP = (struct OVERLAPCONTEXT *)io; struct connection *c = OVERLAP->c; uint32_t err_code = io->err_code; for(;;) { if(bytestransfer == 0 || (bytestransfer < 0 && err_code != EAGAIN)) { printf("send close\n"); c->send_overlap.isUsed = 0; if(!c->recv_overlap.isUsed) { //-1,passive close c->_on_disconnect(c,-1); } break; } else if(bytestransfer < 0 && err_code == EAGAIN) { break; } else { while(bytestransfer > 0) { update_send_list(c,bytestransfer); io = prepare_send(c); if(!io) { //没有数据需要发送了 c->send_overlap.isUsed = 0; if(c->is_close) { bytestransfer = 0; break; } else return; } bytestransfer = Send(c->socket,io,&err_code); } } } }
void SendFinish(int32_t bytestransfer,struct connection *c,uint32_t err_code) { do{ if(bytestransfer == 0) return; else if(bytestransfer < 0 && err_code != EAGAIN){ //printf("send close\n"); if(c->status & SESTABLISH) { ShutDownSend(c->socket); c->status = (c->status | SWCLOSE); }else if(c->status & SWAITCLOSE) { c->status = SCLOSE; CloseSocket(c->socket); c->cb_disconnect(c,0); } return; }else if(bytestransfer > 0) { do{ update_send_list(c,bytestransfer); st_io *io = prepare_send(c); if(!io) { c->doing_send = 0; if(c->status & SWAITCLOSE) { //数据已经发送完毕,关闭 c->status = SCLOSE; CloseSocket(c->socket); c->cb_disconnect(c,0); } return; } bytestransfer = Send(c->socket,io,&err_code); }while(bytestransfer > 0); } }while(1); }