Come può un gioco impedire alle persone di eseguire più istanze di se stesso?


15

Starcraft II mi impedisce di eseguire più istanze, ma se eseguo la seconda istanza in modalità sandbox in Sandboxie , funziona. Cosa potrebbe spiegare questo?

Come potrei replicare questo comportamento per i miei giochi?

Risposte:


15

A parte Starcraft 2, la risposta generale è: acquisire (e bloccare, se l'acquisizione stessa non è già equivalente al blocco) una risorsa specifica dal sistema operativo. Esci dal gioco se l'acquisizione / blocco falliscono. Esempi di tali risorse sono:

  1. Porte TCP o UDP specifiche.
  2. Blocchi reciprocamente esclusivi ("mutex") o semafori (questi due sono spesso correlati a livello di sistema operativo)
  3. File (i file di registro sono spesso la scelta più ovvia)

Nell'estremità più complessa per il cliente, è possibile utilizzare in questo modo anche hardware specializzato che (a volte necessariamente, come per alcuni componenti di controllo robotici) può essere utilizzato esclusivamente da un singolo thread.


5
Inoltre, può essere utile tenere a mente possibili complicazioni di sicurezza: " Un programma a istanza singola è la propria negazione del servizio ".
Basta il

Dal momento che funziona in sandboxie, probabilmente non è il primo. 2 o 3 sono buone possibilità, dando un'occhiata a quali file sono aperti ai loro processi probabilmente lo individueranno.
Doug-W,

3
@ Doug-W Non vedo come funziona in sandboxie esclude # 1.
Attaccando

@AttackingHobo se non mi manca la comprensione della complessità del sandboxie, il fatto che una porta sia vincolata all'esterno del sandboxie non gli impedisce di legarsi all'interno? Oppure sandboxie fornisce un'interfaccia virtuale per ciascun programma in esecuzione al suo interno?
Doug-W,

@Vigil Per quanto mi riguarda, puoi citare Raymond Chen tutto il giorno, ma per favore non aggiungere errori grammaticali alle sue citazioni. : P (Basta copiarli / incollarli invece.)
hheimbuerger

4

Raccomando l'approccio mutex, ma:

Un altro metodo che viene spesso utilizzato è semplicemente verificare se è in esecuzione un altro processo con lo stesso nome.

Il vantaggio è che è ridicolmente semplice: non devi preoccuparti dei permessi dei file o sapere cos'è un mutex. Il rovescio della medaglia è che otterrai un falso positivo se un programma diverso chiamato starcraft2.exeè in esecuzione sulla macchina.


2
Hehe, o se l'utente decide di rinominare il programma.
Brandon,

@Jonathan: Quindi non codificare il nome dell'eseguibile ...
BlueRaja - Danny Pflughoeft

1
Intendevo più come, cosa succede se l'utente copia il programma e lo rinomina e lo esegue due volte?
Brandon,

3

Se stai usando C ++ e l'API di Windows, un modo che puoi fare è usare FindWindow, dove puoi passare parametri come il nome della classe e / o il nome della finestra. Quindi se trovi una corrispondenza, esci dal programma prima ancora di caricare o creare una finestra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.