/** * trennt die Verbindung zu einem Client. * * @param[in] p der Spieler. * * @author FloSoft */ void LobbyServer::Disconnect(LobbyPlayer& p) { LobbyPlayerMapIterator it = players.find(p.getId()); players_kill.push_back(it->first); if(!p.getName().empty()) SendToAll(LobbyMessage_Chat("SYSTEM", p.getName() + " left the lobby")); // schließen p.NoHost(); p.detach(); SendServerList(0xFFFFFFFF); SendPlayerList(0xFFFFFFFF); }
/** * aktualisiert den Mapnamen in einem Servereintrag. * * @author FloSoft */ void LobbyServer::OnNMSLobbyServerUpdateMap(unsigned int id, const std::string& map) { LobbyPlayer& player = players[id]; if(player.updateHost(map)) { LobbyServerInfo info; MYSQLCLIENT.GetServerInfo(player.getServerId(), &info); std::stringstream text; text << player.getName() << " created the server " << info.getName(); SendToAll(LobbyMessage_Chat("SYSTEM", text.str())); // Spielerliste aktualisieren SendServerList(0xFFFFFFFF); } }
void Action1000::onMessage(MSG_HEAD* head) { CMsgAccountLogin msg; msg.SetBuffer((const char*)head, head->len); std::string name = msg.m_info->name; std::string pwd = msg.m_info->pwd; unsigned char result = 0; unsigned long long userid = 0; std::string query = StringTool::Format("SELECT * FROM `account` " "WHERE `user_name`='%s' AND `user_pwd`='%s' LIMIT 1;", name.c_str(), pwd.c_str()); GetCommand()->SetCommandText(query); std::shared_ptr<DataReader> reader = GetCommand()->ExecuteReader(); if (reader && reader->HasRow()) { std::shared_ptr<DataTable> table = reader->GetDataTable(); std::shared_ptr<DataRow> row = table->GetRow(0); row->SetStringItem("login_ip", msg.m_info->ip); row->SetIntItem("login_time", time(nullptr)); if (row->Update(GetCommand())) { result = SMsgAccountLogin::LR_SUCCESS; userid = row->GetIntItem("id"); } else { result = SMsgAccountLogin::LR_FAIL; } } else { result = SMsgAccountLogin::LR_INVALID_USER_OR_PWD; } Context::GetInstance()->GetOnlineOvertime()->AddUser(userid); SMsgAccountLogin send_msg; send_msg.m_info->result = result; send_msg.m_info->userid = userid; Send(&send_msg); if (result == SMsgAccountLogin::LR_SUCCESS) { SendServerList(); } }
/** * verarbeitet die Login-Nachricht eines Clients. * * @param[in] message Nachricht, welche ausgeführt wird * @param[in] client die Nummer des Clients * * @author FloSoft */ void LobbyServer::OnNMSLobbyLogin(unsigned int id, const unsigned int revision, const std::string& user, const std::string& pass, const std::string& version) { LobbyPlayer& player = players[id]; // Protokollversion prüfen if(!CheckProtocolVersion(revision, user, player)) return; std::string email; if(MYSQLCLIENT.LoginUser(user, pass, email, player.getPeerIP())) { LobbyPlayer* oldPlayer = GetPlayer(user); if(oldPlayer && oldPlayer->isLoggedIn()) { LOG.write("User %s@%s already logged on (slot %d == %d)!\n") % user % player.getPeerIP() % id % oldPlayer->getId(); player.Send(new LobbyMessage_Login_Error("Already logged in. On connection loss just wait a bit then try again.")); // alten Spieler rauswerfen Disconnect(*oldPlayer); } else { LOG.write("User %s@%s logged on\n") % user % player.getPeerIP(); player.occupy(user, email, version); player.Send(new LobbyMessage_Login_Done(email)); SendToAll(LobbyMessage_Chat("SYSTEM", user + " hat die Lobby betreten")); SendServerList(0xFFFFFFFF); SendPlayerList(0xFFFFFFFF); } } else { LOG.write("User %s invalid (password %s wrong?)\n") % user % "********"; player.Send(new LobbyMessage_Login_Error("User/password combination is unknown!")); Disconnect(player); } }
int main() { int y=0; InitMSGs(); Register(); if(fork() == 0) while(1) PublicText(); if(fork() == 0) while(1) SendServerList(); if(fork() == 0) while(1) LoginClient(); if(fork() == 0) while(1) SendUsersList(); if(fork() == 0) while(1) SendRoomsList(); if(fork() == 0) while(1) SendUsersOnRoomList(); if(fork() == 0) while(1) ChangeUserRoom(); while(y == 0) { } //Unregister(); //wait(NULL); return 0; }
int main(int argc, char **argv) // ignore_convention { NETADDR BindAddr; dbg_logger_stdout(); net_init(); mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; BindAddr.port = VERSIONSRV_PORT; if(!g_NetOp.Open(BindAddr, 0)) { dbg_msg("mastersrv", "couldn't start network"); return -1; } BuildPackets(); ReadNews(); ReadServerList(); dbg_msg("versionsrv", "started"); while(1) { g_NetOp.Update(); // process packets CNetChunk Packet; while(g_NetOp.Recv(&Packet)) { if(Packet.m_DataSize == sizeof(VERSIONSRV_GETVERSION) && mem_comp(Packet.m_pData, VERSIONSRV_GETVERSION, sizeof(VERSIONSRV_GETVERSION)) == 0) { SendVer(&Packet.m_Address); char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&Packet.m_Address, aAddrStr, sizeof(aAddrStr), false); dbg_msg("versionsrv", "version request by %s", aAddrStr); } if(Packet.m_DataSize == sizeof(VERSIONSRV_GETNEWS) && mem_comp(Packet.m_pData, VERSIONSRV_GETNEWS, sizeof(VERSIONSRV_GETNEWS)) == 0) { SendNews(&Packet.m_Address); } if(Packet.m_DataSize == sizeof(VERSIONSRV_GETMAPLIST) && mem_comp(Packet.m_pData, VERSIONSRV_GETMAPLIST, sizeof(VERSIONSRV_GETMAPLIST)) == 0) { CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; for(int i = 0; i < m_NumPackets; i++) { p.m_DataSize = m_aPackets[i].m_Size; p.m_pData = &m_aPackets[i].m_Data; g_NetOp.Send(&p); } } if(m_ServerListLoaded && Packet.m_DataSize == sizeof(VERSIONSRV_GETDDNETLIST) + 4 && mem_comp(Packet.m_pData, VERSIONSRV_GETDDNETLIST, sizeof(VERSIONSRV_GETDDNETLIST)) == 0) { char aToken[4]; mem_copy(aToken, (char*)Packet.m_pData+sizeof(VERSIONSRV_GETDDNETLIST), 4); SendServerList(&Packet.m_Address, aToken); } } // wait for input net_socket_read_wait(g_NetOp.m_Socket, 1000000); } return 0; }
/** * verarbeitet die ServerList-Anforderung eines Clients. * * @author FloSoft */ void LobbyServer::OnNMSLobbyServerList(unsigned int id) { SendServerList(id); }
/* * Perform a test session. */ static void DoSession( int CtrlSock ) { struct sockaddr_in LocSa; struct stat statbuf; int SaLen, Vmajor, Vminor; char str[256], *line, *p; /* * Get the source address from the control socket. */ SaLen = sizeof LocSa; if( getpeername( CtrlSock, (struct sockaddr *)(&LocSa), &SaLen ) != 0 ) { syslog( LOG_ERR, "Can't get source address from control socket (%m)" ); close( CtrlSock ); exit( 1 ); } syslog( LOG_INFO, "Connection from %s:%d", inet_ntoa( LocSa.sin_addr ), ntohs( LocSa.sin_port ) ); SourceAddress = LocSa.sin_addr; /* * Check if DENYFILE exists and if so, refuse connection */ if (stat(DENYFILE, &statbuf) == 0) { syslog( LOG_INFO, "Connection from %s:%d refused: DENYFILE (%s) exists", inet_ntoa( LocSa.sin_addr ), ntohs( LocSa.sin_port ), DENYFILE); Reply(CtrlSock, 410, "Service temporarily disabled. Please try later"); usleep( 200000 ); close( CtrlSock ); exit( 1 ); } /* * Get the HELO/INFO request from a client */ if ((line = ReadLineTimeout(CtrlSock, 10)) == NULL) { close( CtrlSock ); exit( 1 ); } p = line; if (strncmp(p, "HELO ", 5) != 0) { if (strncmp(p, "INFO", 4) != 0) { Reply(CtrlSock, 510, "Syntax error"); close( CtrlSock ); exit( 1 ); } else { /* Send INFO */ char str[100]; int i = 0; while (strlen(Info[i])) { sprintf(str, "250-%s\r\n", Info[i]); if (write(CtrlSock, str, strlen(str)) != strlen(str)) { syslog( LOG_ERR, "Error writing to socket (%m)"); close( CtrlSock ); exit( 1 ); } i++; } Reply(CtrlSock, 250, ""); } } else { char tBuf[50]; memset(tBuf, 0, 50); p += 5; if (CopyTagField(tBuf, 49, p, "vmajor")) Vmajor = atoi(tBuf); else Vmajor = 0; if (CopyTagField(tBuf, 49, p, "vminor")) Vminor = atoi(tBuf); else Vminor = 0; if (Vmajor < MajorVersion) { sprintf(str, "You need to upgrade, Go to %s", UPGRADE_URL); Reply(CtrlSock, 501, str); usleep( 200000 ); close( CtrlSock ); exit( 1 ); } SendServerList( CtrlSock ); } usleep( 200000 ); close( CtrlSock ); exit( 0 ); }