0

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

1 回答 1

0

What I usually do is add a command-line parameter, 'StartupDelay'. When the server/whatever starts up, before attempting to run the listener etc, it checks for that parameter. If no param, it runs up normally, if it finds 'StartupDelay=2000', it sleeps for 2 seconds before attempting to start the listener etc.

Result - if started from desktop icon, it starts immediately. If it needs to 'restart itself' it sets the parameter to instruct the new instance of itself to wait as directed.

于 2013-11-10T10:39:06.513 回答