重启应用程序:延迟

时间:2013-11-10 08:55:08

标签: c++ windows udp crysis

我正在将重启功能编码到我最新的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();
}

1 个答案:

答案 0 :(得分:0)

我通常做的是添加一个命令行参数'StartupDelay'。当服务器/任何启动时,在尝试运行侦听器等之前,它会检查该参数。如果没有param,它会正常运行,如果它找到'StartupDelay = 2000',它会在尝试启动监听器等之前休眠2秒。

结果 - 如果从桌面图标启动,则会立即启动。如果它需要'重启自己',它会设置参数以指示自身的新实例按指示等待。