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; }
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); }
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_ <<"}"); }
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_); }
//类似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; }
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); }
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; }
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; }