我必须为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(这只是合乎逻辑的),但我坚持解决这个问题。
我只是希望客户端在共享内存和服务器上交替工作,以检查游戏的值等。
我之前从未使用过信号量,我找到的所有文档或示例只能与一个客户端和一个服务器一起工作,但从不使用多个客户端。
请赐教!
答案 0 :(得分:2)
我看到一件奇怪的事情和两件显然是错误的事情
if(shared_memory->id_needed = 1)
volatile
提示编译器变量可以在串行代码流之外更改。或者更好地宣布它是原子的。