Пример #1
0
int32_t CDaemonServer::on_disconnect(CBasePacket* packet, uint32_t sid, CConnection* connection)
{
	DAEMON_WARNING("daemon client disconnected! sid = " << sid);
	//通知数据读取接口取消本连接正在获取的过程
	if(phy_db_ != NULL)
		phy_db_->on_connection_disconnected(connection);


	ServerElementMap::iterator it = element_map_.find(sid);
	if(it == element_map_.end())
	{
		DAEMON_WARNING("error sid!! sid = " << sid);
		return 0;
	}

	//发送通告
	for(ServerElementMap::iterator eit = element_map_.begin(); eit != element_map_.end(); ++ eit)
	{
		if(it->second.server_id_ != eit->second.server_id_ && !eit->second.is_null()) //只发除自己以外激活的服务器
		{
			eit->second.stop_notify(it->second.server_id_, it->second.server_type_);
		}
	}

	it->second.clear_info();

	DAEMON_INFO("del server, server id = " << sid << ", server type = " << GetServerName(it->second.server_type_) 
		<< ", net_type = " << it->second.net_type_ << ", tel_addr = " << it->second.get_tel_addr() << ", cnc_addr = " << it->second.get_cnc_addr());

	return 0;
}
Пример #2
0
void CDaemonServer::process_server_info(const ServerInfoJson& json_obj, CConnection* connection)
{
	//结果校验
	if(json_obj.result != 0)
	{
		DAEMON_WARNING("query server info failed! stype = " << GetServerName(json_obj.type) << ", peer addr = " << connection->get_remote_addr());
		element_map_.erase(json_obj.sid);

		return;
	}

	Inet_Addr tel_addr, cnc_addr;
	
	ServerElementMap::iterator it = element_map_.find(json_obj.sid);
	if(it != element_map_.end() && it->second.is_null() && json_obj.type == it->second.server_type_) //判断是否是重连
	{
		it->second.null_ = false;

		it->second.tel_addr_.set_ip(json_obj.ip_ct);
		it->second.cnc_addr_.set_ip(json_obj.ip_un);
		it->second.net_type_ = json_obj.net_type;
		it->second.server_type_ = json_obj.type;
		
		tel_addr = it->second.tel_addr_;
		cnc_addr = it->second.cnc_addr_;
	}
	else //刚启动的SERVER
	{
		CDaemonElement element;
		uint16_t port = get_port(json_obj.type);

		tel_addr.set_ip(json_obj.ip_ct);
		tel_addr.set_port(port);
		cnc_addr.set_ip(json_obj.ip_un);
		cnc_addr.set_port(port);

		element.set_server_info(json_obj.type, json_obj.sid, json_obj.net_type, tel_addr, cnc_addr);
		element_map_[json_obj.sid] = element;
	}

	//建立节点关联关系
	CONN_MANAGER()->add_server(json_obj.sid, json_obj.type, json_obj.net_type, tel_addr, cnc_addr);
	connection->set_server_id(json_obj.sid);
	CONN_MANAGER()->on_add_connection(connection);
	//发送响应
	send_register_res(json_obj.type, json_obj.sid, json_obj.net_type, tel_addr, cnc_addr, connection);
	//发送通告
	for(ServerElementMap::iterator eit = element_map_.begin(); eit != element_map_.end(); ++ eit)
	{
		if(json_obj.sid != eit->second.server_id_ && !eit->second.is_null()) //只发除自己以外激活的服务器
		{
			eit->second.start_notify(json_obj.sid, json_obj.type, json_obj.net_type, tel_addr, cnc_addr);
		}
	}
	
	DAEMON_INFO("on add server, sid = " << json_obj.sid << ", stype = " <<GetServerName(json_obj.type) << ", net type = " 
		<< json_obj.net_type << ", tel_addr = " << tel_addr << ",cnc_addr = " << cnc_addr);

}
Пример #3
0
void CDaemonElement::start_notify(uint32_t server_id, uint8_t server_type, uint16_t net_type, const Inet_Addr &tel_addr, const Inet_Addr &cnc_addr)
{
	//将通告发送给自己
	INIT_CORE_REQUEST(self_packet, DAEMON_ADD_SERVER);

	Daemon_Add_Server self_add_server;
	self_add_server.sid_ = server_id;
	self_add_server.stype_ = server_type;
	self_add_server.net_type_ = net_type;
	self_add_server.tel_addr_ = tel_addr;
	self_add_server.cnc_addr_ = cnc_addr;

	self_packet.set_body(self_add_server);
	SendDispathByID(self_packet, server_id_);

	DAEMON_INFO("send DAEMON_ADD_SERVER, to server id = " << server_id_ << ", server type = " << GetServerName(server_type_)\
		<< "{packet.sid = " <<server_id << ", packet.stype = " <<  GetServerName(server_type) << ", net type = " << net_type << ", packet.tel_addr = " << tel_addr  \
		<< ", packet.cnc_addr = " << cnc_addr <<"}");

	//将通告发送给伙伴

	INIT_CORE_REQUEST(peer_packet, DAEMON_ADD_SERVER);

	Daemon_Add_Server peer_add_server;
	peer_add_server.sid_ = server_id_;
	peer_add_server.stype_ = server_type_;
	peer_add_server.net_type_ = net_type_;
	peer_add_server.tel_addr_ = tel_addr_;
	peer_add_server.cnc_addr_ = cnc_addr_;

	peer_packet.set_body(peer_add_server);
	SendDispathByID(peer_packet, server_id);

	DAEMON_INFO("send DAEMON_ADD_SERVER, to server id = " << server_id << ", server type = " << GetServerName(server_type) \
		<< "{packet.sid = " <<server_id_ << ", packet.stype = " <<  GetServerName(server_type_) << ", net type = " << net_type_ \
		<< ", tel_addr = " << tel_addr_ << ", packet.cnc_addr = " << cnc_addr_ <<"}");
}
Пример #4
0
void CDaemonElement::stop_notify(uint32_t server_id, uint8_t server_type)
{
	//将通告发送给自己
	INIT_CORE_REQUEST(self_packet, DAEMON_DEL_SERVER);

	Daemon_Del_Server self_del_server;
	self_del_server.sid_ = server_id;
	self_del_server.stype_ = server_type;

	DAEMON_INFO("send DAEMON_DEL_SERVER, to server id = " << server_id_ << ", server type = " << GetServerName(server_type_) \
		<< "{packet.sid = " <<server_id << ", packet.stype = " <<  GetServerName(server_type) << "}");

	self_packet.set_body(self_del_server);
	SendDispathByID(self_packet, server_id_);
}
Пример #5
0
//类似STUN的消息,可以判断服务器的使用的外网地址,在core框架中可以选择性的开启
int32_t CDaemonServer::on_daemon_ping(CBasePacket *packet, uint32_t sid, const Inet_Addr &remote_addr)
{
	Daemon_Stun_Ping *ping = (Daemon_Stun_Ping *)packet;
	
	INIT_CORE_REQUEST(msg, DAEMON_STUN_PONG);

	Daemon_Stun_Pong pong;
	pong.wan_addr_ = remote_addr;
	msg.set_data(pong);

	CONN_MANAGER()->send_udp(msg, remote_addr);

	DAEMON_INFO("on daemon ping from " << remote_addr);

	return 0;
}
Пример #6
0
void CDaemonServer::send_register_res(uint8_t type, uint32_t sid, uint16_t net_type, const Inet_Addr& tel_addr, const Inet_Addr& cnc_addr, CConnection* connection)
{
	INIT_CORE_REQUEST(packet, DAEMON_REGISTER_RES);

	Daemon_Register_Res res;
	res.stype_ = type;
	res.sid_ = sid;
	res.net_type_ = net_type;
	res.tel_addr_ = tel_addr;
	res.cnc_addr_ = cnc_addr;
	
	packet.set_data(res);

	DAEMON_INFO("send register res, sid = " << sid << ", stype = " << GetServerName(type) << ", net_type = "<< net_type << ", tel_addr = " << tel_addr << ", cnc_addr = " << cnc_addr);

	connection->send(packet);
}
Пример #7
0
int32_t CDaemonServer::on_node_state(CBasePacket* packet, uint32_t sid, CConnection* connection)
{
	DAEMON_INFO("recv node state from sid = " << sid);

	Daemon_Node_State* req = (Daemon_Node_State *)packet;

	ServerElementMap::iterator it = element_map_.find(sid);
	if(it != element_map_.end() && dc_id_ > 0)
	{
		NodeStateJson json;
		json.sid = sid;
		json.info = Base64::encode(req->node_state_);

		string json_param;
		json.Serialize(json_param);

		//TODO:实时处理服务单元的报告信息,可以存在后端的数据库中,以便分析
	}
	return 0;
}
Пример #8
0
int32_t CDaemonServer::on_register_req(CBasePacket* packet, uint32_t sid, CConnection* connection)
{
	Daemon_Register_Req* req = (Daemon_Register_Req *)packet;

	DAEMON_INFO("register req = " << *req);
	if(req->stype_ <= eDaemon_Server)
	{
		DAEMON_WARNING("client not create server!!!");
		return 0;
	}

	Inet_Addr remote_addr = connection->get_remote_addr();

	ServerElementMap::iterator it = element_map_.find(req->sid_);
	if(it != element_map_.end() && !it->second.is_null() 
		&& (it->second.tel_addr_.get_ip() == remote_addr.get_ip() || it->second.cnc_addr_.get_ip() == remote_addr.get_ip()))
	{
		DAEMON_WARNING("error sid!! sid = " << req->sid_);
		return 0;
	}

	if(req->cnc_addr_.get_port() != 0 || req->tel_addr_.get_port() != 0) //DAEMON关闭重连
	{
		CDaemonElement element;

		element.set_server_info(req->stype_, req->sid_, req->net_type_, req->tel_addr_, req->cnc_addr_);
		element.null_ = true;
		element_map_[req->sid_] = element;
	}

	//调用获取服务单元的物理机器信息,主要获取IP地址信息、地理位置信息、运营商信息等
	if(phy_db_ != NULL)
		phy_db_->get_physical_server(sid, req->stype_, remote_addr.ip_to_string(), connection);

	return 0;
}