Exemplo 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);
			}
		}
	}
}
Exemplo n.º 2
0
int32_t send_packet(struct connection *c,wpacket_t w)
{
    if(!test_sendable(c->status)){
		wpk_destroy(&w);
		return -1;
	}
	st_io *O;
	if(w){
		w->base.tstamp = GetSystemMs64();
        LLIST_PUSH_BACK(&c->send_list,w);
	}
	if(!c->doing_send){
	    c->doing_send = 1;
		O = prepare_send(c);
		if(O) return Post_Send(c->socket,O);
	}
	return 0;
}
Exemplo n.º 3
0
int32_t connection_send(struct connection *c,wpacket_t w,packet_send_finish callback)
{

	int32_t bytestransfer = 0;
	uint32_t err_code = 0;
	st_io *O;
	int32_t ret = 1;
	if(w)
	{
		w->_packet_send_finish = callback;
		LINK_LIST_PUSH_BACK(c->send_list,w);
	}
	if(!c->send_overlap.isUsed)
	{
		c->send_overlap.isUsed = 1;
		O = prepare_send(c);	
		return WSASend(c->socket,O,0,&err_code);
	}
}
Exemplo n.º 4
0
int32_t connection_send(struct connection *c,wpacket_t w,packet_send_finish callback)
{
	st_io *O;
	if(w)
	{
		w->send_tick = GetCurrentMs();
		w->_packet_send_finish = callback;
		LINK_LIST_PUSH_BACK(c->send_list,w);
	}
	if(!c->send_overlap.isUsed)
	{
		O = prepare_send(c);
		if(O)
		{
			c->send_overlap.isUsed = 1;	
			return Post_Send(c->socket,O);
		}
	}
	return 0;
}
Exemplo n.º 5
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);
}