(多个)客户端和服务器游戏的共享内存和信号量

时间:2014-05-31 11:47:06

标签: c multithreading synchronization semaphore shared-memory

我必须为C课程编写一个小游戏,并且必须使用共享内存,信号量和可以处理多个客户端的客户端/服务器架构(游戏的确切要求是2)。

两个客户端需要轮流进行轮换,并且它们由相同的程序表示(此处不涉及fork() - 都以./client开头)

服务器必须在启动时创建所有资源。所以我的主要问题是关于信号量。 (共享内存和游戏逻辑内容有效,或者实现起来非常困难。)

要确定服务器或客户端是否可以访问共享内存,我需要一个信号量。我需要第二个来决定哪些客户端可以访问。我是对的吗?

所以我得到了一个提示,可以通过为客户端分配ID来完成。所以共享内存有三个额外的变量,如:

struct game
{
    int id_needed, client_id, id_ready;
    ... // additional stuff that is needed for the game logic itself
};

当服务器启动时,我将一个信号量初始化为0,另一个信号量为1。 当第一个客户端出现时,它会检查他的ID是否仍为0(它已初始化为零)

如果是这样,它会尝试:

while(my_id == 0)
{
   if(semaphore_down(semaphore_1) == 0) // Check if I have access to shared mem
   {
       shared_memory->id_needed = 1;
       if(shared_memory->id_ready == 1)
       {
           my_id = shared_memory->client_id;
           (void) printf("DEBUGGING: My ID is %d\n", my_id);
       }
   }
}
shared_memory->id_needed = 0;

在服务器上我做...

while(1)
{
    if(shared_memory->id_needed = 1)
    {
        (void) printf("DEBUGGING: ID is needed for another client!");
        shared_memory->client_id++;
        shared_memory->id_ready = 1;
        (void) printf("DEBBUGING: Dispatched new ID: %d", shared_memory->client_id);
    }
    // If enough players, start the game ...
}

我真的被困在这里了。服务器只是递增ID(这只是合乎逻辑的),但我坚持解决这个问题。

我只是希望客户端在共享内存和服务器上交替工作,以检查游戏的值等。

我之前从未使用过信号量,我找到的所有文档或示例只能与一个客户端和一个服务器一起工作,但从不使用多个客户端。

请赐教!

1 个答案:

答案 0 :(得分:2)

我看到一件奇怪的事情和两件显然是错误的事情

  1. 我看到semaphore_down但你所展示的代码中没有semaphore_up
  2. 您指定而不是比较:if(shared_memory->id_needed = 1)
  3. 即使是比较,也不管怎样,因为编译器可以自由地优化它。使此变量volatile提示编译器变量可以在串行代码流之外更改。或者更好地宣布它是原子的。