2012-04-14 71 views
1

因此,这里的情况,我要开发UNIX用c多玩家游戏。现在我创建了套接字,服务器和客户端通信正常。现在这个游戏包括板,所以每个客户端具有的100x40其自己的2D阵列,以及他们正在使用的读/写(其工作确定太)到服务器发送所述x和y位置。ç共享内存使用fork()的

现在,在服务器上,我使用fork()的,这样新的客户端可以加入游戏。在孩子的部分,我收到了x和y的位置。现在的问题是,我怎么能存储x和y位置,以“全球”板[100] [40]在服务器中发现(这样我就可以检查碰撞等)。我发现的困难是每个孩子都有自己的版本,因为我使用fork(),而且我只更新那个特定孩子的板子。我希望每次客户端发送x和y位置时,我都会将它们放置在服务器中找到的主板上。

我读过,我需要使用某种形式的IPC,如共享内存,但无法弄清楚。如果有人能帮助它将不胜感激,谢谢。

+0

这个回答可以帮助你:http://stackoverflow.com/questions/1327349/how-can-i-share-memory-between-parent-child-process-that-free-the-memory-automat – 2012-04-14 15:35:11

+0

为什么不使用线程而不是进程? – 2012-04-14 15:35:31

+0

我们的讲师强烈建议使用分叉来代替它,因为它更容易,不需要担心竞争条件等。 – 2012-04-14 16:00:28

回答

2

使用共享内存API调用:shmget,shmat,shmdet,... Example code

如果服务器是简单的,你可以使用线程。使用线程可以简单地访问相同的全局变量。

1

您可以使用线程而不是进程,因为它们是轻量级的,即它们的开销较小。我们的想法是在堆上分配电路板,以便在此过程中的所有线程之间共享电路板。

当有新的玩家在游戏中,create a new thread加盟。

当玩家需要更新他们的董事会信息,共享董事会应在相互独占的方式访问,以防止race condition,如:

void UpdateBoard(int X, int Y) 
{ 
    // e.g., pthread_mutex_lock 
    Enter critical section 
    .. 
    Update board(X, Y) 
    .. 
    // e.g., pthread_mutex_unlock 
    Leave critical section 
} 
0

使用数据库将解决你所有的锁定/并发问题。