เกมจะป้องกันไม่ให้ผู้คนเรียกใช้ตัวเองหลาย ๆ กรณีได้อย่างไร


15

Starcraft II จำกัด ฉันไม่ให้เรียกใช้หลายอินสแตนซ์ แต่ถ้าฉันเรียกใช้อินสแตนซ์ที่สองที่sandboxed ใน Sandboxieมันใช้งานได้ สิ่งนี้อาจเป็นสาเหตุของอะไร

ฉันจะทำซ้ำพฤติกรรมนี้สำหรับเกมของตัวเองได้อย่างไร

คำตอบ:


15

นอกเหนือจากสตาร์คราฟต์ 2 คำตอบทั่วไปของเรื่องนี้คือ: ได้รับ (และล็อคถ้าการได้มานั้นไม่เท่ากับการล็อค) ทรัพยากรเฉพาะจากระบบปฏิบัติการ ออกจากเกมหากการได้มา / การล็อคล้มเหลว ตัวอย่างของทรัพยากรดังกล่าวคือ:

  1. พอร์ต TCP หรือ UDP เฉพาะ
  2. ล็อคพิเศษร่วมกัน ("mutexes") หรือ semaphores (ทั้งสองมักจะเกี่ยวข้องกับระดับ OS)
  3. ไฟล์ (ไฟล์บันทึกมักเป็นตัวเลือกที่ชัดเจนที่สุด)

บนสุดปลายสุดความเจ็บปวดในทางของลูกค้าฮาร์ดแวร์พิเศษซึ่ง (บางครั้งจำเป็นเช่นสำหรับส่วนประกอบการควบคุมหุ่นยนต์บางตัว) สามารถใช้งานได้โดยเธรดเดี่ยวเท่านั้นที่สามารถใช้วิธีนี้ได้เช่นกัน


5
นอกจากนี้อาจเป็นประโยชน์ในการจำความยุ่งยากด้านความปลอดภัยที่เป็นไปได้: " โปรแกรมอินสแตนซ์เดียวคือมันปฏิเสธการให้บริการ "
EnoughTea

เนื่องจากใช้งานได้ใน sandboxie อาจไม่ใช่ครั้งแรก 2 หรือ 3 เป็นไปได้ที่ดีโดยการดูว่าไฟล์ใดบ้างที่เปิดให้กระบวนการของพวกเขาอาจจะระบุได้
Doug-W

3
@ Doug-W ฉันไม่เห็นวิธีการทำงานใน sandboxie กฎ # 1
AttackHobo

@AttackingHobo ยกเว้นว่าฉันเข้าใจความซับซ้อนของ sandboxie แล้วความจริงที่ว่าพอร์ตนั้นถูกผูกไว้นอก sandboxie จะแยกออกจากการเชื่อมโยงภายในหรือไม่ หรือ sandboxie ให้ส่วนต่อประสานเสมือนสำหรับแต่ละโปรแกรมที่ทำงานอยู่ในนั้น
Doug-W

@Vigil เท่าที่ฉันกังวลคุณสามารถพูด Raymond Chen ได้ทุกวัน แต่โปรดอย่าเพิ่มข้อผิดพลาดทางไวยากรณ์ลงในคำพูดของเขา : P (เพียงคัดลอก / วางแทน)
hheimbuerger

4

ฉันแนะนำวิธี mutex แต่:

อีกวิธีที่ใช้บ่อยคือตรวจสอบว่ากระบวนการอื่นที่ใช้ชื่อเดียวกันนั้นกำลังทำงานอยู่หรือไม่

ข้อดีคือมันง่ายอย่างน่าขัน - คุณไม่ต้องกังวลกับการอนุญาตของไฟล์หรือรู้ว่า mutex คืออะไร ข้อเสียคือคุณจะได้รับการเท็จบวกถ้าแตกต่างกันโปรแกรมที่เรียกว่าstarcraft2.exeกำลังทำงานอยู่บนเครื่อง


2
อิอิหรือถ้าผู้ใช้ตัดสินใจเปลี่ยนชื่อโปรแกรม
แบรนดอน

@ Jonathan: แล้วอย่า hardcode ชื่อปฏิบัติการ ...
BlueRaja - Danny Pflughoeft

1
ฉันหมายถึงมากกว่านั้นจะเกิดอะไรขึ้นถ้าผู้ใช้คัดลอกโปรแกรมและเปลี่ยนชื่อ & รันใหม่สองครั้ง
แบรนดอน

3

หากคุณใช้ C ++ และ Windows API วิธีหนึ่งที่คุณสามารถทำได้คือการใช้FindWindowซึ่งคุณสามารถส่งพารามิเตอร์เช่นชื่อคลาสและ / หรือชื่อหน้าต่าง จากนั้นหากคุณพบการแข่งขันเพียงออกจากโปรแกรมของคุณก่อนที่คุณจะโหลดหรือสร้างหน้าต่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.