Hallo, ich habe gerade einen Selbsttest mit einem in C# geschriebenem Programm an meinem Server gemacht, indem ich mehrere Bots als Player getarnt auf den Server verbinden lasse. Bei ~ 110 gleichzeitigen eingehenden Verbindungen crashed der Server.
Deshalb habe ich mir kurz überlegt, wie man das verhindern bzw. unterdrücken kann.
Das ganze funktioniert über einen IP und Client-Version Check.
Das Tutorial
Zuerst erstellen wird einen neuen Ordner im scriptfiles-Ordner.
Ihr könnt diesen nennen wir ihr wollt. Ich nenne diesen mal "flood_protection".
Als nächstes verwende ich die Include-Datei "dini". Ihr könnt natürlich auch jedes andere File-System verwenden.
Das ganze lässt sich auch problemlos auf MySQL oder ein anderes Datenbank-System übertragen.
Wir inkludieren also dini und prüfen bei OnPlayerConnect, ob der Spieler mit dieser IP bereits verbunden ist:
#define SERVER_VERSION "0.3e" // die server-version
public OnPlayerConnect(playerid)
{
new playerIp[16], version[10], path[33];
GetPlayerIp(playerid, playerIp, sizeof(playerIp)); // IP adresse auslesen
GetPlayerVersion(playerid, version, sizeof(version)); // client-version des spielers auslesen
do // die punkte in der IP entfernen
{
new dotPosition = strfind(playerIp, ".");
strdel(playerIp, dotPosition, dotPosition + 1);
} while (strfind(playerIp, ".") != -1);
format(path, sizeof(path), "flood_protection/%s.ip", playerIp);
if (!strcmp(version, SERVER_VERSION))
{
if (dini_Exists(path))
{
Kick(playerid); // spieler ist bereits mit einem anderen account verbunden
}
else
{
dini_Create(path); // spieler ist noch nicht verbunden, deshalb legen wir einen eintrag an
}
}
else
{
Kick(playerid); // der spieler verbindet nicht mit der version, mit der der server läuft
}
return true;
}
Jetzt haben wir den Hauptteil.
Allerdings müssen wir beim Verlassen des Spielers den Datei-Eintrag auch wieder entfernen:
public OnPlayerDisconnect(playerid, reason)
{
new playerIp[16], path[33];
GetPlayerIp(playerid, playerIp, sizeof(playerIp)); // IP adresse auslesen
do // die punkte in der IP entfernen
{
new dotPosition = strfind(playerIp, ".");
strdel(playerIp, dotPosition, dotPosition + 1);
} while (strfind(playerIp, ".") != -1);
format(path, sizeof(path), "flood_protection/%s.ip", playerIp);
if (dini_Exists(path))
{
dini_Remove(path); // eintrag entfernen
}
return true;
}
Das ganze ist frei aus dem Kopf geschrieben und ungetestet.
Das sollte soweit aber funktionieren.
Hackt mir für Rechtschreibfehler bitte nicht den Kopf ab.
Lg.