Exemplo n.º 1
0
/**
 *  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);
}
Exemplo n.º 2
0
/**
 *  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);
    }
}
Exemplo n.º 3
0
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();
    }
}
Exemplo n.º 4
0
/**
 *  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);
    }
}
Exemplo n.º 5
0
Arquivo: server.c Projeto: skony/sopy
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;

}
Exemplo n.º 6
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;
}
Exemplo n.º 7
0
/**
 *  verarbeitet die ServerList-Anforderung eines Clients.
 *
 *  @author FloSoft
 */
void LobbyServer::OnNMSLobbyServerList(unsigned int id)
{
    SendServerList(id);
}
Exemplo n.º 8
0
/*
 * 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 );

}