当前位置: 首页 > 知识库问答 >
问题:

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

洪鸿
2023-03-14

我必须为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 ...
}

请开导我!

共有1个答案

农弘毅
2023-03-14

我在这里看到了一件奇怪的事情和两件明显是错误的事情

  1. 在您显示的代码中,我看到信号量_down,但没有信号量_up
  2. 分配而不是比较:如果(shared_memory->id_need=1)
  3. 即使是比较,也是不对的,因为编译器可以自由地优化它。使此变量volatile,以提示编译器该变量可以在串行代码流之外更改。或者最好声明它是原子的。
 类似资料:
  • 我在Linux上使用C。我需要构建使用共享内存和信号量进行通信的两个程序。 其中一个程序必须充当服务器(一次只能充当一个),另一个程序必须充当客户机(一次任意数量)。通信应遵循以下模式: 我知道如何在两个进程之间使用共享内存和信号量,但我不知道如何在数量不明的进程之间进行通信时使用它们。我考虑为每个客户机使用共享内存块,但我必须交换密钥并通知服务器新的客户机。所以这并不能解决问题。

  • 我的项目是在服务器上读取一个图像,进行一些处理,然后将整个图像传递给客户端。客户端接收图像并进行更多处理,然后将一些输出值返回给服务器。服务器和客户端之间使用的映像大小为[640x480x3]。 以下是我想到的实现这个问题的各种技术: 通过消息将整个像素值从服务器传递到客户端 在SO中有各种各样的答案。我目前正在努力让它工作。 服务器和客户端之间的这种消息传递模式是否可能?如果是,请提供一些文档参

  • 我不太了解共享内存是如何工作的,我试图编写一个服务器-客户机程序,在该程序中,服务器和客户机使用共享内存和信号量相互通信。

  • 我正在使用POSIX共享内存和未命名信号量实现客户机服务器。服务器可以同时处理多个客户端。该代码适用于单个客户端,但不适用于多个客户端。POSIX操作是用,

  • 我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码: