¿Cómo puede un juego evitar que las personas ejecuten múltiples instancias de sí mismo?

15

Starcraft II me impide ejecutar varias instancias, pero si ejecuto la segunda instancia de sandbox en Sandboxie , funciona. ¿Qué podría explicar esto?

¿Cómo podría replicar este comportamiento para mis propios juegos?

Brandon
fuente

Respuestas:

15

Además de Starcraft 2, la respuesta general a esto es: Adquirir (y bloquear, si la adquisición en sí misma no es equivalente a bloquear) un recurso específico del sistema operativo. Sal del juego si falla la adquisición / bloqueo. Ejemplos de tales recursos son:

  1. Puertos TCP o UDP específicos.
  2. Cerraduras mutuamente excluyentes ("mutexes") o semáforos (esos dos a menudo están relacionados a nivel del sistema operativo)
  3. Archivos (los archivos de registro suelen ser la opción más obvia)

En el extremo superior, la mayoría de las molestias para el cliente, el hardware especializado que (a veces necesariamente, como para algunos componentes de control robótico) solo puede usarse exclusivamente por un solo hilo, también puede usarse de esta manera.

Martin Sojka
fuente
55
También puede ser útil tener en cuenta las posibles complicaciones de seguridad: " Un programa de instancia única es su propia denegación de servicio ".
EnoughTea
Como funciona en sandboxie, probablemente no sea el primero. 2 o 3 son buenas posibilidades, echando un vistazo a qué archivos están abiertos a sus procesos probablemente lo localizará.
Doug-W
3
@ Doug-W No veo cómo funciona en sandboxie descarta el n. ° 1.
AttackingHobo
@AttackingHobo a menos que no comprenda la complejidad de sandboxie, ¿el hecho de que un puerto esté atado fuera de sandboxie no impediría que se vincule dentro? ¿O sandboxie proporciona una interfaz virtual para cada programa que se ejecuta dentro de él?
Doug-W
@Vigil En lo que a mí respecta, puede citar a Raymond Chen todo el día, pero no agregue errores gramaticales a sus citas. : P (Simplemente cópielos / péguelos en su lugar.)
hheimbuerger
4

Recomiendo el enfoque mutex, pero:

Otro método que se usa con frecuencia es simplemente verificar si se está ejecutando otro proceso con el mismo nombre.

La ventaja es que es ridículamente fácil: no tiene que preocuparse por los permisos de archivos ni saber qué es un mutex. La desventaja es que obtendrá un falso positivo si se ejecuta un programa diferente llamado starcraft2.exeen la máquina.

BlueRaja - Danny Pflughoeft
fuente
2
Jeje, o si el usuario decide cambiar el nombre del programa.
Brandon
@ Jonathan: Entonces no codifique el nombre del ejecutable ...
BlueRaja - Danny Pflughoeft
1
Quise decir más bien, ¿qué pasa si el usuario copia el programa y lo renombra y lo ejecuta dos veces?
Brandon
3

Si está utilizando C ++ y la API de Windows, una forma de hacerlo es mediante el uso de FindWindowparámetros como el nombre de la clase y / o el nombre de la ventana. Luego, si encuentra una coincidencia, simplemente salga de su programa incluso antes de cargar o crear una ventana.

SourceTurtle
fuente