Я администратор проекта GameComa.ru и мне надоело поднимать сервер каждый раз после его падения.
Я написал мини-программку для автоматического поднятия сервера.
(мой код не претендует на идеальный, вы всегда можете использовать его за основу чего-то другого).
- Code: Select all
using System;
using System.Net.Sockets;
using System.Threading;
namespace LiF_server_cheker
{
class Program
{
public static string ip = "127.0.0.1";
public static int port = 28000;
public static string pName = "ddctd_cm_yo_server";
public static string pPath = "D:\\steam\\servers\\feudals\\ddctd_cm_yo_server.exe";
static void Main(string[] args)
{
Connect(ip, port, 0x0E);
}
public static int count = 0;
static void Connect(String server, Int32 port, byte message)
{
while (true)
{
string time = DateTime.Now.ToString();
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.SendTimeout = 2000;
client.ReceiveTimeout = 2000;
try
{
client.Connect(server, port);
byte[] data = new byte[1] { message };
int bytes = client.Send(data);
Console.WriteLine(time + " Sended {0} bytes", bytes);
byte[] buffer = new byte[256];
bytes = client.Receive(buffer);
Console.WriteLine(time + " Received {0} bytes", bytes);
if (bytes > 0)
{
Console.Write(time + " Message: ");
for (int i = 0; i < bytes; i++) Console.Write("{0:X} ", buffer[i]);
Console.WriteLine();
Thread.Sleep(5000);
}
else
{
Restart();
}
client.Close();
Thread.Sleep(2000);
}
catch(SocketException e)
{
//Console.Write(e);
Restart();
}
}
}
static void Restart()
{
string time = DateTime.Now.ToString();
if (count == 10)
{
Console.WriteLine(time + " Server Down!");
Console.WriteLine(time + " Closing crashed server...");
string name = pName;
System.Diagnostics.Process[] etc = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process anti in etc)
if (anti.ProcessName.ToLower().Contains(name.ToLower())) anti.Kill();
Thread.Sleep(5000);
Console.WriteLine(time + " Trying to start");
System.Diagnostics.Process.Start(pPath);
try
{
string namewf = "WerFault";
System.Diagnostics.Process[] werfault = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process anti in werfault)
if (anti.ProcessName.ToLower().Contains(namewf.ToLower())) anti.Kill();
}
catch { }
count = 0;
Thread.Sleep(300000);
}
else
{
Console.WriteLine(time + " Attempt to check: " + count);
Thread.Sleep(1000);
count++;
}
}
}
}
,где:
ip - IP-адрес вашего сервера(ипользуйте 127.0.0.1, т.к. приложение умеет работать только локально).
port - игровой порт сервера.
pName - имя exe файла, которое висит в процессах (по умолчанию это ddctd_cm_yo_server !!!БЕЗ .exe!!!).
pPath - путь к файлу запуска сервера(обязательно использовать \\ вместо \ в пути к файлу).
Логика работы:
Отправляем пакет, если получаем 1, то все хорошо - проверяем через 5 секунд.
Если получаем 0(сервер завис), то убиваем процесс сервера и возможное окно об ошибке, ждем 5 минут, проверяем работу.
Если не получен ответ от сервера(сервер упал или какие-то жуткие лаги(например, как на рассвете)), делаем 10 попыток подключения, если подключиться не удалось - перезагружаем сервер, убиваем возможное окно об ошибке.
Как собрать:
Качаем Microsoft Visual Studio Express (бесплатная версия) -> устанавливаем -> создаем консольное приложение C# -> вставляем код -> выбираем Release сборку, жмем F5.
После чего находим собранный файл в папке проекта: Project Name/bin/Release, берем EXE-файл -> вы великолепны
О всех найденных ошибках можно и нужно писать в этой теме.
Данный скрипт уже работает на нашем сервере.
В списке мы: GameComa.ru
Либо консольной командой: joinToRemoteServer("88.87.84.203:28000","")