//------------------------------------------------------------------------------------- bool EntityAutoLoader::process() { Network::Channel* pChannel = Components::getSingleton().getDbmgrChannel(); if(pChannel == NULL || querying_) return true; if(entityTypes_.size() > 0) { if ((*entityTypes_.begin()).size() > 0) { Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject(); if (start_ == 0 && end_ == 0) end_ = LOAD_ENTITY_SIZE; uint16 dbInterfaceIndex = g_kbeSrvConfig.getDBMgr().dbInterfaceInfos.size() - entityTypes_.size(); (*pBundle).newMessage(DbmgrInterface::entityAutoLoad); (*pBundle) << dbInterfaceIndex << g_componentID << (*(*entityTypes_.begin()).begin()) << start_ << end_; pChannel->send(pBundle); querying_ = true; } else { entityTypes_.erase(entityTypes_.begin()); } return true; } delete this; return false; }
//------------------------------------------------------------------------------------- void InterfacesHandler_Interfaces::charge(Network::Channel* pChannel, KBEngine::MemoryStream& s) { Network::Channel* pInterfacesChannel = Dbmgr::getSingleton().networkInterface().findChannel(g_kbeSrvConfig.interfacesAddr()); KBE_ASSERT(pInterfacesChannel); if(pInterfacesChannel->isDestroyed()) { if(!this->reconnect()) return; } std::string chargeID; std::string datas; CALLBACK_ID cbid; DBID dbid; s >> chargeID; s >> dbid; s.readBlob(datas); s >> cbid; INFO_MSG(fmt::format("InterfacesHandler_Interfaces::charge: chargeID={0}, dbid={3}, cbid={1}, datas={2}!\n", chargeID, cbid, datas, dbid)); Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(InterfacesInterface::charge); (*pBundle) << pChannel->componentID(); (*pBundle) << chargeID; (*pBundle) << dbid; (*pBundle).appendBlob(datas); (*pBundle) << cbid; pInterfacesChannel->send(pBundle); }
//------------------------------------------------------------------------------------- bool InterfacesHandler_Interfaces::createAccount(Network::Channel* pChannel, std::string& registerName, std::string& password, std::string& datas, ACCOUNT_TYPE uatype) { Network::Channel* pInterfacesChannel = Dbmgr::getSingleton().networkInterface().findChannel(g_kbeSrvConfig.interfacesAddr()); KBE_ASSERT(pInterfacesChannel); if(pInterfacesChannel->isDestroyed()) { if(!this->reconnect()) { return false; } } Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(InterfacesInterface::reqCreateAccount); (*pBundle) << pChannel->componentID(); uint8 accountType = uatype; (*pBundle) << registerName << password << accountType; (*pBundle).appendBlob(datas); pInterfacesChannel->send(pBundle); return true; }
//------------------------------------------------------------------------------------- void EntityIDClient::onAlloc(void) { if(size() > id_enough_limit) { setReqServerAllocFlag(false); return; } if(hasReqServerAlloc()) return; Network::Channel* pChannel = Components::getSingleton().getDbmgrChannel(); if(pChannel == NULL) { ERROR_MSG("EntityIDClient::onAlloc: not found dbmgr!\n"); return; } Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(DbmgrInterface::onReqAllocEntityID); DbmgrInterface::onReqAllocEntityIDArgs2::staticAddToBundle((*pBundle), pApp_->componentType(), pApp_->componentID()); pChannel->send(pBundle); setReqServerAllocFlag(true); WARNING_MSG(fmt::format("EntityIDClient::onAlloc: not enough({}) entityIDs!\n", id_enough_limit)); }
//------------------------------------------------------------------------------------- void Loginapp::onReqCreateAccountResult(Network::Channel* pChannel, MemoryStream& s) { SERVER_ERROR_CODE failedcode; std::string accountName; std::string password; std::string retdatas = ""; s >> failedcode >> accountName >> password; s.readBlob(retdatas); DEBUG_MSG(fmt::format("Loginapp::onReqCreateAccountResult: accountName={}, failedcode={}.\n", accountName.c_str(), failedcode)); PendingLoginMgr::PLInfos* ptinfos = pendingCreateMgr_.remove(accountName); if(ptinfos == NULL) return; Network::Channel* pClientChannel = this->networkInterface().findChannel(ptinfos->addr); if(pClientChannel == NULL) return; pClientChannel->extra(""); Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject(); (*pBundle).newMessage(ClientInterface::onCreateAccountResult); (*pBundle) << failedcode; (*pBundle).appendBlob(retdatas); pClientChannel->send(pBundle); SAFE_RELEASE(ptinfos); }
//------------------------------------------------------------------------------------- void NetworkInterface::processChannels(KBEngine::Network::MessageHandlers* pMsgHandlers) { ChannelMap::iterator iter = channelMap_.begin(); for(; iter != channelMap_.end(); ) { Network::Channel* pChannel = iter->second; if(pChannel->isDestroyed()) { ++iter; } else if(pChannel->isCondemn()) { ++iter; deregisterChannel(pChannel); pChannel->destroy(); Network::Channel::reclaimPoolObject(pChannel); } else { pChannel->processPackets(pMsgHandlers); ++iter; } } }
//------------------------------------------------------------------------------------- bool Proxy::sendToClient(bool expectData) { if(!clientMailbox()) return false; Network::Channel* pChannel = clientMailbox()->getChannel(); if(!pChannel) return false; if(expectData) { if(pChannel->bundles().size() == 0) { WARNING_MSG("Proxy::sendToClient: no data!\n"); return false; } } { // 如果数据大量阻塞发不出去将会报警 AUTO_SCOPED_PROFILE("sendToClient"); pChannel->send(); } return true; }
//------------------------------------------------------------------------------------- void LogWatcher::onMessage(LOG_ITEM* pLogItem) { if(!VALID_COMPONENT(pLogItem->componentType) || filterOptions_.componentBitmap[pLogItem->componentType] == 0) return; if(filterOptions_.uid != pLogItem->uid) return; if((filterOptions_.logtypes & pLogItem->logtype) <= 0) return; if(filterOptions_.globalOrder > 0 && filterOptions_.globalOrder != pLogItem->componentGlobalOrder) return; if(filterOptions_.groupOrder > 0 && filterOptions_.groupOrder != pLogItem->componentGroupOrder) return; Network::Channel* pChannel = Logger::getSingleton().networkInterface().findChannel(addr_); if(pChannel == NULL) return; if(!validDate_(pLogItem->logstream.str()) || !containKeyworlds_(pLogItem->logstream.str())) return; Network::Bundle* pBundle = Network::Bundle::createPoolObject(); ConsoleInterface::ConsoleLogMessageHandler msgHandler; (*pBundle).newMessage(msgHandler); (*pBundle) << pLogItem->logstream.str().c_str(); pChannel->send(pBundle); }
//------------------------------------------------------------------------------------- void ServerApp::onAppActiveTick(Network::Channel* pChannel, COMPONENT_TYPE componentType, COMPONENT_ID componentID) { if(componentType != CLIENT_TYPE) if(pChannel->isExternal()) return; Network::Channel* pTargetChannel = NULL; if(componentType != CONSOLE_TYPE && componentType != CLIENT_TYPE) { Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(componentType, KBEngine::getUserUID(), componentID); if(cinfos == NULL || cinfos->pChannel == NULL) { ERROR_MSG(fmt::format("ServerApp::onAppActiveTick[{:p}]: {}:{} not found.\n", (void*)pChannel, COMPONENT_NAME_EX(componentType), componentID)); return; } pTargetChannel = cinfos->pChannel; pTargetChannel->updateLastReceivedTime(); } else { pChannel->updateLastReceivedTime(); pTargetChannel = pChannel; } //DEBUG_MSG("ServerApp::onAppActiveTick[%x]: %s:%"PRAppID" lastReceivedTime:%"PRIu64" at %s.\n", // pChannel, COMPONENT_NAME_EX(componentType), componentID, pChannel->lastReceivedTime(), pTargetChannel->c_str()); }
//------------------------------------------------------------------------------------- InterfacesHandler_Interfaces::~InterfacesHandler_Interfaces() { Network::Channel* pInterfacesChannel = Dbmgr::getSingleton().networkInterface().findChannel(g_kbeSrvConfig.interfacesAddr()); if(pInterfacesChannel) { pInterfacesChannel->condemn(); } pInterfacesChannel = NULL; }
//------------------------------------------------------------------------------------- bool Proxy::pushBundle(Network::Bundle* pBundle) { if(!clientMailbox()) return false; Network::Channel* pChannel = clientMailbox()->getChannel(); if(!pChannel) return false; pChannel->send(pBundle); return true; }
//------------------------------------------------------------------------------------- bool SyncEntityStreamTemplateHandler::process() { Components::COMPONENTS& cts = Components::getSingleton().getComponents(DBMGR_TYPE); Network::Channel* pChannel = NULL; if(cts.size() > 0) { Components::COMPONENTS::iterator ctiter = cts.begin(); if((*ctiter).pChannel == NULL) return true; pChannel = (*ctiter).pChannel; } if(pChannel == NULL) return true; MemoryStream accountDefMemoryStream; ENGINE_COMPONENT_INFO& dbcfg = g_kbeSrvConfig.getDBMgr(); ScriptDefModule* scriptModule = EntityDef::findScriptModule(dbcfg.dbAccountEntityScriptType); if(scriptModule == NULL) { delete this; return false; } ScriptDefModule::PROPERTYDESCRIPTION_MAP& propertyDescrs = scriptModule->getPersistentPropertyDescriptions(); ScriptDefModule::PROPERTYDESCRIPTION_MAP::const_iterator iter = propertyDescrs.begin(); if(scriptModule->hasCell()) { Vector3 pos, dir; ADD_POSDIR_TO_STREAM(accountDefMemoryStream, pos, dir); } for(; iter != propertyDescrs.end(); ++iter) { PropertyDescription* propertyDescription = iter->second; accountDefMemoryStream << propertyDescription->getUType(); propertyDescription->addPersistentToStream(&accountDefMemoryStream, NULL); } Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject(); (*pBundle).newMessage(DbmgrInterface::syncEntityStreamTemplate); (*pBundle).append(accountDefMemoryStream); pChannel->send(pBundle); delete this; return false; }
//------------------------------------------------------------------------------------- void Loginapp::onReqCreateAccountResult(Network::Channel* pChannel, MemoryStream& s) { SERVER_ERROR_CODE failedcode; std::string accountName; std::string password; std::string retdatas = ""; s >> failedcode >> accountName >> password; s.readBlob(retdatas); // 把请求交由脚本处理 SCOPED_PROFILE(SCRIPTCALL_PROFILE); PyObject* pyResult = PyObject_CallMethod(getEntryScript().get(), const_cast<char*>("onCreateAccountCallbackFromDB"), const_cast<char*>("sHy#"), accountName.c_str(), failedcode, retdatas.c_str(), retdatas.length()); if(pyResult != NULL) { Py_DECREF(pyResult); } else { SCRIPT_ERROR_CHECK(); } DEBUG_MSG(fmt::format("Loginapp::onReqCreateAccountResult: accountName={}, failedcode={}.\n", accountName.c_str(), failedcode)); PendingLoginMgr::PLInfos* ptinfos = pendingCreateMgr_.remove(accountName); if(ptinfos == NULL) return; Network::Channel* pClientChannel = this->networkInterface().findChannel(ptinfos->addr); if(pClientChannel == NULL) return; pClientChannel->extra(""); Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(ClientInterface::onCreateAccountResult); (*pBundle) << failedcode; (*pBundle).appendBlob(retdatas); pClientChannel->send(pBundle); SAFE_RELEASE(ptinfos); }
//------------------------------------------------------------------------------------- void Proxy::kick() { // 如果被销毁频道仍然存活则将其关闭 Network::Channel* pChannel = Baseapp::getSingleton().networkInterface().findChannel(addr_); if(pChannel && !pChannel->isDestroyed()) { Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(ClientInterface::onKicked); ClientInterface::onKickedArgs1::staticAddToBundle(*pBundle, SERVER_ERR_PROXY_DESTROYED); //pBundle->send(Baseapp::getSingleton().networkInterface(), pChannel); this->sendToClient(ClientInterface::onKicked, pBundle); this->sendToClient(); pChannel->condemn(); } }
//------------------------------------------------------------------------------------- void InterfacesHandler_Interfaces::eraseClientReq(Network::Channel* pChannel, std::string& logkey) { Network::Channel* pInterfacesChannel = Dbmgr::getSingleton().networkInterface().findChannel(g_kbeSrvConfig.interfacesAddr()); KBE_ASSERT(pInterfacesChannel); if(pInterfacesChannel->isDestroyed()) { if(!this->reconnect()) return; } Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(InterfacesInterface::eraseClientReq); (*pBundle) << logkey; pInterfacesChannel->send(pBundle); }
//------------------------------------------------------------------------------------- void EntityMailbox::c_str(char* s, size_t size) { const char * mailboxName = (type_ == MAILBOX_TYPE_CELL) ? "Cell" : (type_ == MAILBOX_TYPE_BASE) ? "Base" : (type_ == MAILBOX_TYPE_CLIENT) ? "Client" : (type_ == MAILBOX_TYPE_BASE_VIA_CELL) ? "BaseViaCell" : (type_ == MAILBOX_TYPE_CLIENT_VIA_CELL) ? "ClientViaCell" : (type_ == MAILBOX_TYPE_CELL_VIA_BASE) ? "CellViaBase" : (type_ == MAILBOX_TYPE_CLIENT_VIA_BASE) ? "ClientViaBase" : "???"; Network::Channel* pChannel = getChannel(); kbe_snprintf(s, size, "%s id:%d, utype:%u, component=%s[%" PRIu64 "], addr: %s.", mailboxName, id_, utype_, COMPONENT_NAME_EX(ENTITY_MAILBOX_COMPONENT_TYPE_MAPPING[type_]), componentID_, (pChannel && pChannel->pEndPoint()) ? pChannel->addr().c_str() : "None"); }
//------------------------------------------------------------------------------------- Proxy::~Proxy() { Baseapp::getSingleton().decProxicesCount(); // 如果被销毁频道仍然存活则将其关闭 Network::Channel* pChannel = Baseapp::getSingleton().networkInterface().findChannel(addr_); if(pChannel && !pChannel->isDestroyed()) { Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject(); (*pBundle).newMessage(ClientInterface::onKicked); ClientInterface::onKickedArgs1::staticAddToBundle(*pBundle, SERVER_ERR_PROXY_DESTROYED); //pBundle->send(Baseapp::getSingleton().networkInterface(), pChannel); this->sendToClient(ClientInterface::onKicked, pBundle); this->sendToClient(); pChannel->condemn(); } SAFE_RELEASE(pProxyForwarder_); }
//------------------------------------------------------------------------------------- bool EntityMailboxAbstract::postMail(Network::Bundle* pBundle) { KBE_ASSERT(Components::getSingleton().pNetworkInterface() != NULL); Network::Channel* pChannel = getChannel(); if(pChannel && !pChannel->isDead()) { pChannel->send(pBundle); return true; } else { ERROR_MSG(fmt::format("EntityMailboxAbstract::postMail: invalid channel({})!\n", addr_.c_str())); } Network::Bundle::ObjPool().reclaimObject(pBundle); return false; }
//------------------------------------------------------------------------------------- void Interfaces::accountLoginResponse(std::string commitName, std::string realAccountName, std::string extraDatas, KBEngine::SERVER_ERROR_CODE errorCode) { REQLOGIN_MAP::iterator iter = reqAccountLogin_requests_.find(commitName); if (iter == reqAccountLogin_requests_.end()) { // 理论上不可能找不到,但如果真找不到,这是个很恐怖的事情,必须写日志记录下来 ERROR_MSG(fmt::format("Interfaces::accountLoginResponse: commitName '{}' not found!" \ "realAccountName = '{}', extra datas = '{}', error code = '{}'\n", commitName, realAccountName, extraDatas, errorCode)); return; } LoginAccountTask *task = iter->second; Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(DbmgrInterface::onLoginAccountCBBFromInterfaces); (*pBundle) << task->baseappID << commitName << realAccountName << task->password << errorCode; (*pBundle).appendBlob(task->postDatas); (*pBundle).appendBlob(extraDatas); Network::Channel* pChannel = Interfaces::getSingleton().networkInterface().findChannel(task->address); if(pChannel) { pChannel->send(pBundle); } else { ERROR_MSG(fmt::format("Interfaces::accountLoginResponse: not found channel. commitName={}\n", commitName)); Network::Bundle::reclaimPoolObject(pBundle); } // 清理 reqAccountLogin_requests_.erase(iter); delete task; }
//------------------------------------------------------------------------------------- void GlobalDataClient::onDataChanged(PyObject* key, PyObject* value, bool isDelete) { std::string skey = script::Pickler::pickle(key, 0); std::string sval = ""; if(value) sval = script::Pickler::pickle(value, 0); Components::COMPONENTS& channels = Components::getSingleton().getComponents(serverComponentType_); Components::COMPONENTS::iterator iter1 = channels.begin(); uint8 dataType = dataType_; ArraySize slen = 0; for(; iter1 != channels.end(); iter1++) { Network::Channel* lpChannel = iter1->pChannel; KBE_ASSERT(lpChannel != NULL); Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject(); (*pBundle).newMessage(DbmgrInterface::onBroadcastGlobalDataChanged); (*pBundle) << dataType; (*pBundle) << isDelete; slen = skey.size(); (*pBundle) << slen; (*pBundle).assign(skey.data(), slen); if(!isDelete) { slen = sval.size(); (*pBundle) << slen; (*pBundle).assign(sval.data(), slen); } (*pBundle) << g_componentType; (*pBundle).send(lpChannel->networkInterface(), lpChannel); Network::Bundle::ObjPool().reclaimObject(pBundle); } }
//------------------------------------------------------------------------------------- void NetworkProfileHandler::sendStream(MemoryStream* s) { Network::Channel* pChannel = networkInterface_.findChannel(addr_); if(pChannel == NULL) { WARNING_MSG(fmt::format("NetworkProfileHandler::sendStream: not found {} addr({})\n", name_, addr_.c_str())); return; } Network::Bundle* pBundle = Network::Bundle::createPoolObject(); ConsoleInterface::ConsoleProfileHandler msgHandler; (*pBundle).newMessage(msgHandler); int8 type = 3; (*pBundle) << type; (*pBundle).append(s); pChannel->send(pBundle); }
//------------------------------------------------------------------------------------- void Interfaces::chargeResponse(std::string orderID, std::string extraDatas, KBEngine::SERVER_ERROR_CODE errorCode) { ORDERS::iterator iter = orders_.find(orderID); if (iter == orders_.end()) { // 理论上不可能找不到,但如果真找不到,这是个很恐怖的事情,必须写日志记录下来 ERROR_MSG(fmt::format("Interfaces::chargeResponse: order id '{}' not found! extra datas = '{}', error code = '{}'", orderID, extraDatas, errorCode)); return; } KBEShared_ptr<Orders> orders = iter->second; Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(DbmgrInterface::onChargeCB); (*pBundle) << orders->baseappID << orders->ordersID << orders->dbid; (*pBundle).appendBlob(orders->getDatas); (*pBundle) << orders->cbid; (*pBundle) << errorCode; Network::Channel* pChannel = networkInterface().findChannel(orders->address); if(pChannel) { WARNING_MSG(fmt::format("Interfaces::chargeResponse: orders={} commit is failed!\n", orders->ordersID)); pChannel->send(pBundle); } else { ERROR_MSG(fmt::format("Interfaces::chargeResponse: not found channel. orders={}\n", orders->ordersID)); Network::Bundle::reclaimPoolObject(pBundle); } orders_.erase(iter); }
//------------------------------------------------------------------------------------- bool Proxy::pushBundle(Network::Bundle* pBundle) { if(!clientMailbox()) return false; Network::Channel* pChannel = clientMailbox()->getChannel(); if(!pChannel) return false; pBundle->pChannel(pChannel); pBundle->finiMessage(true); pChannel->pushBundle(pBundle); { // 如果数据大量阻塞发不出去将会报警 //AUTO_SCOPED_PROFILE("pushBundleAndSendToClient"); //pChannel->send(pBundle); } return true; }
//------------------------------------------------------------------------------------- bool InterfacesHandler_Interfaces::loginAccount(Network::Channel* pChannel, std::string& loginName, std::string& password, std::string& datas) { Network::Channel* pInterfacesChannel = Dbmgr::getSingleton().networkInterface().findChannel(g_kbeSrvConfig.interfacesAddr()); KBE_ASSERT(pInterfacesChannel); if(pInterfacesChannel->isDestroyed()) { if(!this->reconnect()) return false; } Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(InterfacesInterface::onAccountLogin); (*pBundle) << pChannel->componentID(); (*pBundle) << loginName << password; (*pBundle).appendBlob(datas); pInterfacesChannel->send(pBundle); return true; }
//------------------------------------------------------------------------------------- void SpaceViewer::sendStream(MemoryStream* s, int type) { Network::Channel* pChannel = Cellapp::getSingleton().networkInterface().findChannel(addr_); if(pChannel == NULL) { WARNING_MSG(fmt::format("SpaceViewer::sendStream: not found addr({})\n", addr_.c_str())); return; } Network::Bundle* pBundle = Network::Bundle::createPoolObject(); ConsoleInterface::ConsoleQuerySpacesHandler msgHandler; (*pBundle).newMessage(msgHandler); (*pBundle) << g_componentType; (*pBundle) << g_componentID; (*pBundle) << type; (*pBundle).append(s); pChannel->send(pBundle); }
//------------------------------------------------------------------------------------- int Components::connectComponent(COMPONENT_TYPE componentType, int32 uid, COMPONENT_ID componentID, bool printlog) { Components::ComponentInfos* pComponentInfos = findComponent(componentType, uid, componentID); if (pComponentInfos == NULL) { if (printlog) { ERROR_MSG(fmt::format("Components::connectComponent: not found componentType={}, uid={}, componentID={}!\n", COMPONENT_NAME_EX(componentType), uid, componentID)); } return -1; } Network::EndPoint * pEndpoint = Network::EndPoint::createPoolObject(); pEndpoint->socket(SOCK_STREAM); if (!pEndpoint->good()) { if (printlog) { ERROR_MSG("Components::connectComponent: couldn't create a socket\n"); } Network::EndPoint::reclaimPoolObject(pEndpoint); return -1; } pEndpoint->addr(*pComponentInfos->pIntAddr); int ret = pEndpoint->connect(pComponentInfos->pIntAddr->port, pComponentInfos->pIntAddr->ip); if(ret == 0) { Network::Channel* pChannel = Network::Channel::createPoolObject(); bool ret = pChannel->initialize(*_pNetworkInterface, pEndpoint, Network::Channel::INTERNAL); if(!ret) { if (printlog) { ERROR_MSG(fmt::format("Components::connectComponent: initialize({}) is failed!\n", pChannel->c_str())); } pChannel->destroy(); Network::Channel::reclaimPoolObject(pChannel); return -1; } pComponentInfos->pChannel = pChannel; pComponentInfos->pChannel->componentID(componentID); if(!_pNetworkInterface->registerChannel(pComponentInfos->pChannel)) { if (printlog) { ERROR_MSG(fmt::format("Components::connectComponent: registerChannel({}) is failed!\n", pComponentInfos->pChannel->c_str())); } pComponentInfos->pChannel->destroy(); Network::Channel::reclaimPoolObject(pComponentInfos->pChannel); // 此时不可强制释放内存,destroy中已经对其减引用 // SAFE_RELEASE(pComponentInfos->pChannel); pComponentInfos->pChannel = NULL; return -1; } else { Network::Bundle* pBundle = Network::Bundle::createPoolObject(); if(componentType == BASEAPPMGR_TYPE) { (*pBundle).newMessage(BaseappmgrInterface::onRegisterNewApp); BaseappmgrInterface::onRegisterNewAppArgs11::staticAddToBundle((*pBundle), getUserUID(), getUsername(), componentType_, componentID_, g_componentGlobalOrder, g_componentGroupOrder, _pNetworkInterface->intaddr().ip, _pNetworkInterface->intaddr().port, _pNetworkInterface->extaddr().ip, _pNetworkInterface->extaddr().port, g_kbeSrvConfig.getConfig().externalAddress); } else if(componentType == CELLAPPMGR_TYPE) { (*pBundle).newMessage(CellappmgrInterface::onRegisterNewApp); CellappmgrInterface::onRegisterNewAppArgs11::staticAddToBundle((*pBundle), getUserUID(), getUsername(), componentType_, componentID_, g_componentGlobalOrder, g_componentGroupOrder, _pNetworkInterface->intaddr().ip, _pNetworkInterface->intaddr().port, _pNetworkInterface->extaddr().ip, _pNetworkInterface->extaddr().port, g_kbeSrvConfig.getConfig().externalAddress); } else if(componentType == CELLAPP_TYPE) { (*pBundle).newMessage(CellappInterface::onRegisterNewApp); CellappInterface::onRegisterNewAppArgs11::staticAddToBundle((*pBundle), getUserUID(), getUsername(), componentType_, componentID_, g_componentGlobalOrder, g_componentGroupOrder, _pNetworkInterface->intaddr().ip, _pNetworkInterface->intaddr().port, _pNetworkInterface->extaddr().ip, _pNetworkInterface->extaddr().port, g_kbeSrvConfig.getConfig().externalAddress); } else if(componentType == BASEAPP_TYPE) { (*pBundle).newMessage(BaseappInterface::onRegisterNewApp); BaseappInterface::onRegisterNewAppArgs11::staticAddToBundle((*pBundle), getUserUID(), getUsername(), componentType_, componentID_, g_componentGlobalOrder, g_componentGroupOrder, _pNetworkInterface->intaddr().ip, _pNetworkInterface->intaddr().port, _pNetworkInterface->extaddr().ip, _pNetworkInterface->extaddr().port, g_kbeSrvConfig.getConfig().externalAddress); } else if(componentType == DBMGR_TYPE) { (*pBundle).newMessage(DbmgrInterface::onRegisterNewApp); DbmgrInterface::onRegisterNewAppArgs11::staticAddToBundle((*pBundle), getUserUID(), getUsername(), componentType_, componentID_, g_componentGlobalOrder, g_componentGroupOrder, _pNetworkInterface->intaddr().ip, _pNetworkInterface->intaddr().port, _pNetworkInterface->extaddr().ip, _pNetworkInterface->extaddr().port, g_kbeSrvConfig.getConfig().externalAddress); } else if(componentType == LOGGER_TYPE) { (*pBundle).newMessage(LoggerInterface::onRegisterNewApp); LoggerInterface::onRegisterNewAppArgs11::staticAddToBundle((*pBundle), getUserUID(), getUsername(), componentType_, componentID_, g_componentGlobalOrder, g_componentGroupOrder, _pNetworkInterface->intaddr().ip, _pNetworkInterface->intaddr().port, _pNetworkInterface->extaddr().ip, _pNetworkInterface->extaddr().port, g_kbeSrvConfig.getConfig().externalAddress); } else { KBE_ASSERT(false && "invalid componentType.\n"); } pComponentInfos->pChannel->send(pBundle); } } else { if (printlog) { ERROR_MSG(fmt::format("Components::connectComponent: connect({}) is failed! {}.\n", pComponentInfos->pIntAddr->c_str(), kbe_strerror())); } Network::EndPoint::reclaimPoolObject(pEndpoint); return -1; } return ret; }
//------------------------------------------------------------------------------------- PyObject* EntityRemoteMethod::tp_call(PyObject* self, PyObject* args, PyObject* kwds) { EntityRemoteMethod* rmethod = static_cast<EntityRemoteMethod*>(self); MethodDescription* methodDescription = rmethod->getDescription(); EntityMailboxAbstract* mailbox = rmethod->getMailbox(); if(!mailbox->isClient()) { return RemoteEntityMethod::tp_call(self, args, kwds); } Entity* pEntity = Cellapp::getSingleton().findEntity(mailbox->id()); if(pEntity == NULL || pEntity->pWitness() == NULL) { //WARNING_MSG(fmt::format("EntityRemoteMethod::callClientMethod: not found entity({}).\n", // mailbox->id())); return RemoteEntityMethod::tp_call(self, args, kwds); } Network::Channel* pChannel = pEntity->pWitness()->pChannel(); if(!pChannel) { PyErr_Format(PyExc_AssertionError, "%s:EntityRemoteMethod(%s)::tp_call: no client, srcEntityID(%d).\n", pEntity->scriptName(), methodDescription->getName(), pEntity->id()); PyErr_PrintEx(0); return RemoteEntityMethod::tp_call(self, args, kwds); } // 如果是调用客户端方法, 我们记录事件并且记录带宽 if(methodDescription->checkArgs(args)) { Network::Bundle* pBundle = pChannel->createSendBundle(); mailbox->newMail((*pBundle)); MemoryStream* mstream = MemoryStream::createPoolObject(); methodDescription->addToStream(mstream, args); if(mstream->wpos() > 0) (*pBundle).append(mstream->data(), (int)mstream->wpos()); if(Network::g_trace_packet > 0) { if(Network::g_trace_packet_use_logfile) DebugHelper::getSingleton().changeLogger("packetlogs"); DEBUG_MSG(fmt::format("EntityRemoteMethod::tp_call: pushUpdateData: ClientInterface::onRemoteMethodCall({}::{})\n", pEntity->scriptName(), methodDescription->getName())); switch(Network::g_trace_packet) { case 1: mstream->hexlike(); break; case 2: mstream->textlike(); break; default: mstream->print_storage(); break; }; if(Network::g_trace_packet_use_logfile) DebugHelper::getSingleton().changeLogger(COMPONENT_NAME_EX(g_componentType)); } // 记录这个事件产生的数据量大小 g_privateClientEventHistoryStats.trackEvent(pEntity->scriptName(), methodDescription->getName(), pBundle->currMsgLength(), "::"); pEntity->pWitness()->sendToClient(ClientInterface::onRemoteMethodCall, pBundle); MemoryStream::reclaimPoolObject(mstream); } S_Return; }
//------------------------------------------------------------------------------------- bool InterfacesHandler_Interfaces::reconnect() { Network::Channel* pInterfacesChannel = Dbmgr::getSingleton().networkInterface().findChannel(g_kbeSrvConfig.interfacesAddr()); if(pInterfacesChannel) { if(!pInterfacesChannel->isDestroyed()) Dbmgr::getSingleton().networkInterface().deregisterChannel(pInterfacesChannel); pInterfacesChannel->destroy(); Network::Channel::reclaimPoolObject(pInterfacesChannel); } Network::Address addr = g_kbeSrvConfig.interfacesAddr(); Network::EndPoint* pEndPoint = Network::EndPoint::createPoolObject(); pEndPoint->addr(addr); pEndPoint->socket(SOCK_STREAM); if (!pEndPoint->good()) { ERROR_MSG("InterfacesHandler_Interfaces::initialize: couldn't create a socket\n"); return true; } pEndPoint->setnonblocking(true); pEndPoint->setnodelay(true); pInterfacesChannel = Network::Channel::createPoolObject(); bool ret = pInterfacesChannel->initialize(Dbmgr::getSingleton().networkInterface(), pEndPoint, Network::Channel::INTERNAL); if(!ret) { ERROR_MSG(fmt::format("InterfacesHandler_Interfaces::initialize: initialize({}) is failed!\n", pInterfacesChannel->c_str())); pInterfacesChannel->destroy(); Network::Channel::reclaimPoolObject(pInterfacesChannel); return 0; } if(pInterfacesChannel->pEndPoint()->connect() == -1) { struct timeval tv = { 0, 1000000 }; // 1000ms fd_set fds; FD_ZERO(&fds); FD_SET((int)(*pInterfacesChannel->pEndPoint()), &fds); bool connected = false; int selgot = select((*pInterfacesChannel->pEndPoint())+1, &fds, &fds, NULL, &tv); if(selgot > 0) { int error; socklen_t len = sizeof(error); #if KBE_PLATFORM == PLATFORM_WIN32 getsockopt(int(*pInterfacesChannel->pEndPoint()), SOL_SOCKET, SO_ERROR, (char*)&error, &len); #else getsockopt(int(*pInterfacesChannel->pEndPoint()), SOL_SOCKET, SO_ERROR, &error, &len); #endif if(0 == error) connected = true; } if(!connected) { ERROR_MSG(fmt::format("InterfacesHandler_Interfaces::reconnect(): couldn't connect to:{}\n", pInterfacesChannel->pEndPoint()->addr().c_str())); pInterfacesChannel->destroy(); Network::Channel::reclaimPoolObject(pInterfacesChannel); return false; } } // 不检查超时 pInterfacesChannel->stopInactivityDetection(); Dbmgr::getSingleton().networkInterface().registerChannel(pInterfacesChannel); return true; }
//------------------------------------------------------------------------------------- PyObject* ClientEntityMethod::callmethod(PyObject* args, PyObject* kwds) { Entity* srcEntity = Cellapp::getSingleton().findEntity(srcEntityID_); if(srcEntity == NULL) { PyErr_Format(PyExc_AssertionError, "Entity::clientEntity(%s): srcEntityID(%d) not found!\n", methodDescription_->getName(), srcEntityID_); PyErr_PrintEx(0); return 0; } if(srcEntity->isDestroyed()) { PyErr_Format(PyExc_AssertionError, "Entity::clientEntity(%s): srcEntityID(%d) is destroyed!\n", methodDescription_->getName(), srcEntityID_); PyErr_PrintEx(0); return 0; } if(!srcEntity->isReal()) { PyErr_Format(PyExc_AssertionError, "%s::clientEntity(%s): not is real entity, srcEntityID(%d).\n", srcEntity->scriptName(), methodDescription_->getName(), srcEntity->id()); PyErr_PrintEx(0); return 0; } if(srcEntity->pWitness() == NULL) { PyErr_Format(PyExc_AssertionError, "%s::clientEntity(%s): no client, srcEntityID(%d).\n", srcEntity->scriptName(), methodDescription_->getName(), srcEntity->id()); PyErr_PrintEx(0); return 0; } Network::Channel* pChannel = srcEntity->pWitness()->pChannel(); if(!pChannel) { PyErr_Format(PyExc_AssertionError, "%s::clientEntity(%s): no client, srcEntityID(%d).\n", srcEntity->scriptName(), methodDescription_->getName(), srcEntity->id()); PyErr_PrintEx(0); return 0; } EntityRef* pEntityRef = srcEntity->pWitness()->getAOIEntityRef(clientEntityID_); Entity* e = (pEntityRef && ((pEntityRef->flags() & (ENTITYREF_FLAG_ENTER_CLIENT_PENDING | ENTITYREF_FLAG_LEAVE_CLIENT_PENDING)) <= 0)) ? pEntityRef->pEntity() : NULL; if(e == NULL) { PyErr_Format(PyExc_AssertionError, "%s::clientEntity(%s): not found entity(%d), srcEntityID(%d).\n", srcEntity->scriptName(), methodDescription_->getName(), clientEntityID_, srcEntity->id()); PyErr_PrintEx(0); return 0; } MethodDescription* methodDescription = getDescription(); if(methodDescription->checkArgs(args)) { MemoryStream* mstream = MemoryStream::createPoolObject(); methodDescription->addToStream(mstream, args); Network::Bundle* pSendBundle = pChannel->createSendBundle(); NETWORK_ENTITY_MESSAGE_FORWARD_CLIENT_START(srcEntity->id(), (*pSendBundle)); int ialiasID = -1; const Network::MessageHandler& msgHandler = srcEntity->pWitness()->getAOIEntityMessageHandler(ClientInterface::onRemoteMethodCall, ClientInterface::onRemoteMethodCallOptimized, clientEntityID_, ialiasID); ENTITY_MESSAGE_FORWARD_CLIENT_START(pSendBundle, msgHandler, aOIEntityMessage); if(ialiasID != -1) { KBE_ASSERT(msgHandler.msgID == ClientInterface::onRemoteMethodCallOptimized.msgID); (*pSendBundle) << (uint8)ialiasID; } else { KBE_ASSERT(msgHandler.msgID == ClientInterface::onRemoteMethodCall.msgID); (*pSendBundle) << clientEntityID_; } if(mstream->wpos() > 0) (*pSendBundle).append(mstream->data(), (int)mstream->wpos()); if(Network::g_trace_packet > 0) { if(Network::g_trace_packet_use_logfile) DebugHelper::getSingleton().changeLogger("packetlogs"); DEBUG_MSG(fmt::format("ClientEntityMethod::callmethod: pushUpdateData: ClientInterface::onRemoteOtherEntityMethodCall({}::{})\n", srcEntity->scriptName(), methodDescription->getName())); switch(Network::g_trace_packet) { case 1: mstream->hexlike(); break; case 2: mstream->textlike(); break; default: mstream->print_storage(); break; }; if(Network::g_trace_packet_use_logfile) DebugHelper::getSingleton().changeLogger(COMPONENT_NAME_EX(g_componentType)); } ENTITY_MESSAGE_FORWARD_CLIENT_END(pSendBundle, msgHandler, aOIEntityMessage); // 记录这个事件产生的数据量大小 g_publicClientEventHistoryStats.trackEvent(srcEntity->scriptName(), (std::string(e->scriptName()) + "." + methodDescription->getName()), pSendBundle->currMsgLength(), "::"); srcEntity->pWitness()->sendToClient(ClientInterface::onRemoteMethodCallOptimized, pSendBundle); MemoryStream::reclaimPoolObject(mstream); } S_Return; }
//------------------------------------------------------------------------------------- void Loginapp::onReqCreateMailAccountResult(Network::Channel* pChannel, MemoryStream& s) { SERVER_ERROR_CODE failedcode; std::string accountName; std::string password; std::string retdatas = ""; s >> failedcode >> accountName >> password; s.readBlob(retdatas); DEBUG_MSG(fmt::format("Loginapp::onReqCreateMailAccountResult: accountName={}, failedcode={}.\n", accountName.c_str(), failedcode)); if(failedcode == SERVER_SUCCESS) { Components::COMPONENTS& loginapps = Components::getSingleton().getComponents(LOGINAPP_TYPE); std::string http_host = "localhost"; if(startGroupOrder_ == 1) { if(strlen((const char*)&g_kbeSrvConfig.getLoginApp().externalAddress) > 0) http_host = g_kbeSrvConfig.getBaseApp().externalAddress; else http_host = inet_ntoa((struct in_addr&)Loginapp::getSingleton().networkInterface().extaddr().ip); } else { Components::COMPONENTS::iterator iter = loginapps.begin(); for(; iter != loginapps.end(); ++iter) { if((*iter).groupOrderid == 1) { if(strlen((const char*)&(*iter).externalAddressEx) > 0) http_host = (*iter).externalAddressEx; else http_host = inet_ntoa((struct in_addr&)(*iter).pExtAddr->ip); } } } threadPool_.addTask(new SendActivateEMailTask(accountName, retdatas, http_host, g_kbeSrvConfig.getLoginApp().http_cbport)); } PendingLoginMgr::PLInfos* ptinfos = pendingCreateMgr_.remove(accountName); if(ptinfos == NULL) return; Network::Channel* pClientChannel = this->networkInterface().findChannel(ptinfos->addr); if(pClientChannel == NULL) return; pClientChannel->extra(""); retdatas = ""; Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(ClientInterface::onCreateAccountResult); (*pBundle) << failedcode; (*pBundle).appendBlob(retdatas); pClientChannel->send(pBundle); SAFE_RELEASE(ptinfos); }