Я кодирую функцию перезапуска в моей новейшей модификации сервера Crysis Wars, которая удаленно перезагружает сервер. Это полезно, если на сервере возникла проблема, и простая перезагрузка системы не устраняет ее, а также полезно сообщить серверу о необходимости перезагрузки в указанное время, чтобы освободить память.
Для этого я кодировал необходимые функции, и само приложение без проблем перезапускается. Проблема заключается в том, что порт закрывается недостаточно быстро, что приводит к появлению нового экземпляра приложения, который не может работать должным образом.
Я ищу идеальное решение для этого, чтобы программа была закрыта и запускается два секунд, а не сразу. Это даст Windows достаточно времени, чтобы освободить порт, который использовал сервер, и очистить всю существующую память.
Обратите внимание: я удалил свой другой (связанный) вопрос, поскольку очевидно, что закрытие портов программы невозможно, если не сказать, чтобы это было сделано, когда он назначил порт, что я не могу сделать, поскольку у меня нет доступа к исходному коду код, который привязывается к порту.
Код, если он требуется
int CScriptBind_GameRules::Restart(IFunctionHandler *pH)
{
bool arg1 = false;
const char *arg2 = "";
gEnv->pScriptSystem->BeginCall("Dynamic","GetValue");
gEnv->pScriptSystem->PushFuncParam("r.enable");
gEnv->pScriptSystem->EndCall(arg1);
gEnv->pScriptSystem->BeginCall("Dynamic","GetValue");
gEnv->pScriptSystem->PushFuncParam("r.line");
gEnv->pScriptSystem->EndCall(arg2);
if (arg1)
{
LogMsg(2, "System restart initiated.");
if (arg2)
{
LogMsg(2, "System Reboot.");
gEnv->pScriptSystem->BeginCall("os","execute");
gEnv->pScriptSystem->PushFuncParam(arg2);
gEnv->pScriptSystem->EndCall(), close((int)gEnv->pConsole->GetCVar("sv_port")->GetString());
return pH->EndFunction();
}
else
{
LogMsg(2, "Internal Faliure.");
return pH->EndFunction();
}
return pH->EndFunction();
}
LogMsg(2, "System restart cancelled: Feature is Disabled.");
return pH->EndFunction();
}
Обычно я добавляю параметр командной строки ‘StartupDelay’. Когда сервер / что-либо запускается, прежде чем пытаться запустить прослушиватель и т. Д., Он проверяет этот параметр. Если нет параметров, он запускается нормально, если он находит «StartupDelay = 2000», он спит в течение 2 секунд, прежде чем пытаться запустить слушатель и т. Д.
Результат — если запустить с иконки на рабочем столе, он запускается немедленно. Если ему нужно «перезапустить себя», он устанавливает параметр, чтобы дать указание новому экземпляру самого себя ждать в соответствии с указаниями.
Других решений пока нет …