Ejemplo n.º 1
0
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);
			}
		}
	}
}
Ejemplo n.º 2
0
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);
}