0

サーバーをリモートで再起動する再起動機能を最新の Crysis Wars サーバーの変更にコーディングしています。これは、サーバーに問題があり、単純なシステムのリロードでは解決しない場合に役立ちます。また、メモリを解放するために指定された時間にサーバーを再起動するように指示する場合にも役立ちます。

これを実現するために必要な機能をコーディングしましたが、アプリケーション自体は再起動に問題はありません。問題は、ポートがすぐに閉じられず、アプリケーションの新しいインスタンスが正しく機能しないことです。

これに対する理想的な解決策を探しています。プログラムがシャットダウンされ、すぐにではなく2秒後に起動されます。これを行うと、サーバーが使用していたポートを解放し、既存のメモリをクリーンアップするのに十分な時間が 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

私が通常行うことは、コマンド ライン パラメーター 'StartupDelay' を追加することです。サーバーなどの起動時に、リスナーなどを実行しようとする前に、そのパラメーターをチェックします。パラメータがない場合は通常どおり起動し、「StartupDelay=2000」が見つかった場合は、リスナーの起動を試みる前に 2 秒間スリープします。

結果 - デスクトップ アイコンから起動すると、すぐに起動します。「自分自身を再起動する」必要がある場合は、パラメーターを設定して、自分自身の新しいインスタンスに指示どおりに待機するように指示します。

于 2013-11-10T10:39:06.513 に答える