Lucrăm la îmbunătățirea site-ului! Este posibil ca unele module să nu funcționeze corect!
1 mesaj

Autor subiect

  • Mesaje: 5
  • Reacții: 12
  • Mesaje utile: 0
  • Status: Pierd vremea ^.^
  • Regat: Jinno
  • Discord: [Vezi ID]
  • Contact:

    Medalii

    Am actualizat funcțiile de gestionare a semnalelor pentru serverele Metin2 pe Windows. Acum, serverul poate fi oprit controlat la primirea semnalelor de închidere sau forțat prin combinația Ctrl+ESC (de 3 ori). În plus, am adăugat o resetare a contorului de combinații dacă trec mai mult de 2 secunde între apăsări.

    De asemenea, salvarea progresului este mult mai precisă, fără delay-ul din command prompt/bash, iar activitatea poate fi reluată imediat, fără întreruperi.

    Aceste îmbunătățiri vor ajuta la o gestionare mai rapidă și sigură a serverului!




    libthecore/src/signal.c
    Code:
    #define __LIBTHECORE__
    #include "stdafx.h"
    #include "globals.h"
    
    #ifdef __WIN32__
    #include <windows.h>
    
    int esc_count = 0;
    DWORD lastEscPressTime = 0;
    
    BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
    {
    	switch (fdwCtrlType)
    	{
    		//case CTRL_C_EVENT:
    		case CTRL_BREAK_EVENT:
    			printf("Graceful shutdown signal received. Shutting down.\n");
    			shutdowned = TRUE;
    			break;
    
    		case CTRL_CLOSE_EVENT:
    		case CTRL_LOGOFF_EVENT:
    		case CTRL_SHUTDOWN_EVENT:
    			printf("Forceful exit signal received. Shutting down instantly.\n");
    			shutdowned = TRUE;
    			break;
    
    		default:
    			return FALSE;
    	}
    	return TRUE;
    }
    
    DWORD WINAPI EscKeyListener(LPVOID lpParam)
    {
    	int combo_count = 0;
    	DWORD lastPressTime = 0;
    	DWORD resetTime = 2000;
    	
    	while (!shutdowned)
    	{
    		if ((GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(VK_ESCAPE) & 0x8000))
    		{
    			DWORD currentTime = GetTickCount();
    	
    			if (currentTime - lastPressTime > resetTime)
    			{
    				combo_count = 0;
    				printf("Timeout exceeded. Resetting combo count.\n");
    			}
    
    			combo_count++;
    			printf("Ctrl+ESC combo pressed %d time(s)\n", combo_count);
    	
    			if (combo_count >= 3)
    			{
    				printf("Ctrl+ESC pressed 3 times. Shutting down server.\n");
    				shutdowned = TRUE;
    			}
    
    			lastPressTime = currentTime;
    
    			while ((GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(VK_ESCAPE) & 0x8000))
    			{
    				Sleep(10);
    			}
    		}
    
    		Sleep(10);
    	}
    	
    	ExitProcess(0);
    	return 0;
    }
    
    void signal_setup()
    {
    	if (!SetConsoleCtrlHandler(CtrlHandler, TRUE))
    	{
    		printf("Error setting control handler.\n");
    	}
    	
    	HANDLE escThread = CreateThread(NULL, 0, EscKeyListener, NULL, 0, NULL);
    	if (escThread == NULL)
    	{
    		printf("Error creating ESC key listener thread.\n");
    	}
    	else
    	{
    		CloseHandle(escThread);  
    	}
    }
    
    void signal_timer_disable() {}
    void signal_timer_enable(int timeout_seconds) {}
    
    #elif __FreeBSD__
    #define RETSIGTYPE void
    
    RETSIGTYPE reap(int sig)
    {
    	while (waitpid(-1, NULL, WNOHANG) > 0);
    	signal(SIGCHLD, reap);
    }
    
    RETSIGTYPE checkpointing(int sig)
    {
    	if (!tics)
    	{
    		sys_err("CHECKPOINT shutdown: tics did not update.");
    		if (bCheckpointCheck)
    			abort();
    	}
    	else
    		tics = 0;
    }
    
    RETSIGTYPE hupsig(int sig)
    {
    	shutdowned = TRUE;
    	sys_log(0, "SIGHUP, SIGINT, SIGTERM signal has been received. Shutting down.");
    }
    
    RETSIGTYPE usrsig(int sig)
    {
    	core_dump();
    }
    
    void signal_timer_disable(void)
    {
    	struct itimerval itime;
    	struct timeval interval;
    
    	interval.tv_sec = 0;
    	interval.tv_usec = 0;
    
    	itime.it_interval = interval;
    	itime.it_value = interval;
    
    	setitimer(ITIMER_VIRTUAL, &itime, NULL);
    }
    
    void signal_timer_enable(int sec)
    {
    	struct itimerval itime;
    	struct timeval interval;
    
    	interval.tv_sec = sec;
    	interval.tv_usec = 0;
    	
    	itime.it_interval = interval;
    	itime.it_value = interval;
    
    	setitimer(ITIMER_VIRTUAL, &itime, NULL);
    }
    
    void signal_setup(void)
    {
    	signal_timer_enable(30);
    
    	signal(SIGVTALRM, checkpointing);
    
    	// Just to be on the safe side:
    	signal(SIGHUP, hupsig);
    	signal(SIGCHLD, reap);
    	signal(SIGINT, hupsig);
    	signal(SIGTERM, hupsig);
    	signal(SIGPIPE, SIG_IGN);
    	signal(SIGALRM, SIG_IGN);
    	signal(SIGUSR1, usrsig);
    }
    
    #endif
    
    


    Pune aceste fisiere in libthecore/src

    Cum descarc de pe TeraBox?

    • Este asemănător cu Mega.nz
    • Instalați-vă clientul lor de Download de aici
    • Faceți-vă un cont (vă puteți loga cu Facebook / Google / etc)
    • Dacă nu vreți să descărcați clientul de Download, folosiți acest site
    • Gata! Acum puteți descărca resursele

    De ce folosim TeraBox?

    • Este gratuit
    • Primești 1TB de spațiu gratuit la orice cont creat!
    • Este ușor de folosit și varianta premium este foarte ieftină
    • Fișierele nu sunt șterse niciodată
    TeraBox logo

    🔥 Hai pe Discord! - Chat activ și support direct

    Te așteptăm și pe serverul de Discord - aici ne-am strâns toată comunitatea de Metin2 din România.

    Alătură-te acum!
    1300+ de membri activi!
    Robot Discord
    Roboțelu'
    Anunț

    Creează-ți un cont sau autentifică-te pentru a participa la discuție

    Trebuie să fii membru pentru a răspunde

    Creează-ți un cont

    Înregistrează-te și alătură-te comunității noastre

    Membrii pot crea subiecte noi și pot descărca resurse Metin2 Gratuit!


    Te poți înregistra rapid utilizând contul tău de Discord sau Github

    Înregistrare

    Autentifică-te

    • Subiecte similare

      • de Andi » » în FIX-uri
        0
        Răspunsuri
        123
        Vizualizări
        de Andi
      • de [HF]White » » în Pet-uri
        0
        Răspunsuri
        1254
        Vizualizări
        de [HF]White
      • de [HF]White » » în Mount-uri
        0
        Răspunsuri
        997
        Vizualizări
        de [HF]White
      • de Sinnr » » în Programe Utile
        3
        Răspunsuri
        308
        Vizualizări
        de Breaker

    Înapoi la “Îmbunătățiri”

    Informații

    Utilizatori ce navighează pe acest forum: Niciun utilizator înregistrat și 6 vizitatori