Example #1
0
int32_t CConnection::send(CCorePacket& packet, bool no_delay)
{
	int32_t ret = -1;

	GAIN_BINSTREAM(strm);

	*strm << packet;

	if(sbuffer_.remaining_length() < strm->data_size() + sizeof(uint32_t))
	{
		if(sbuffer_.length() < MAX_BUFFER_SIZE)//扩大TCP发送缓冲区,防止缓冲区太小造成发送包异常
		{
			sbuffer_.realloc_buffer(strm->data_size() + sizeof(uint32_t));
			CORE_WARNING("sbuffer realloc buffer, size = " << sbuffer_.length());
		}
		else //发送报文丢弃
		{
			CORE_ERROR("sbuffer is full, sbuffer.size = " << sbuffer_.length());
			RETURN_BINSTREAM(strm);

			return -1;
		}
	}

	THROTTLER()->add_tcp_packet(strm->data_size(), true);

	send_flag_ = true;

	if(sbuffer_.put(*strm))
	{
		if(no_delay)
		{
			sbuffer_.send(sock_stream_);
		}


		if(sbuffer_.data_length() > 0)
		{
			REACTOR_INSTANCE()->register_handler(this, MASK_WRITE);
		}
		else
		{
			REACTOR_INSTANCE()->remove_handler(this, MASK_WRITE);
		}

		ret = 0;
	}

	RETURN_BINSTREAM(strm);

	return ret;
}
Example #2
0
int32_t CoreUDPHandler::send(const CCorePacket& packet, const Inet_Addr& remote_addr)
{
    GAIN_BINSTREAM(bin_strm);

    uint8_t packet_type = UDP_CORE_PACKET;
    *bin_strm << packet_type << packet;

    int32_t ret = send(*bin_strm, remote_addr);
    RETURN_BINSTREAM(bin_strm);

    return ret;
}
Example #3
0
int32_t CoreUDPHandler::send(const string& data, const Inet_Addr& remote_addr)
{
    THROTTLER()->add_udp_packet(data.size(), true);

    GAIN_BINSTREAM(bin_strm);
    *bin_strm = data;

    int rc = send(*bin_strm, remote_addr);
    RETURN_BINSTREAM(bin_strm);

    return rc;
}
void Connection_Manager::send_dispatch_by_id(CCorePacket& packet, uint32_t sid)
{
	CConnection* conn = get_connection(sid);
	if(conn == NULL)
	{
		GAIN_BINSTREAM(strm);

		string data;
		*strm << packet;
		strm->bin_to_string(data);
		connecting_by_id(data, sid);

		RETURN_BINSTREAM(strm);
	}
	else
	{
		conn->send(packet);
	}
}
Example #5
0
int32_t CCoreDCClient::on_php_response(CBasePacket* packet, uint32_t sid)
{
	PHPExcResponse* res = (PHPExcResponse *)packet;

	//判断解压
	if(res->zip == 1)
	{
		GAIN_BINSTREAM(strm);
		strm->resize(res->src_size);

		uint32_t uncomp_size = 0;
		if(LZO()->uncompress((uint8_t *)res->result.data(), res->result.size(), strm->get_wptr(), uncomp_size) == 0 && uncomp_size > 0)
		{
			strm->set_used_size(uncomp_size);
			strm->bin_to_string(res->result);
		}

		RETURN_BINSTREAM(strm);
	}

	DCTimerSet::iterator it = timer_ids_.find(res->exc_id);
	if(it != timer_ids_.end())
	{
		CoreDCParam* param = cancel_dc_request(res->exc_id);
		if(param != NULL)
		{
			//回执一个结果!!!
			if(param->event_ != NULL && !param->release_flag_)
				param->event_->dc_response(param, res->result, res->exc_id);
			else
				delete param;
		}
	}

	return 0;
}