2012-04-14 16 views
1

ここで状況はありますが、私はunixでcを使ってマルチプレーヤーゲームを開発しなければなりません。今私はソケットを作成し、サーバーとクライアントはokを通信しています。今ではこのゲームにはボードが含まれているので、各クライアントは100x40の2次元配列を持ち、読み取り/書き込み(これも正常に動作しています)を使ってxとyの位置をサーバーに送ります。fork()を使ったC共有メモリ

今、サーバーでは、新しいクライアントがゲームに参加できるように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 –

+0

なぜプロセスの代わりにスレッドを使用しないでください。 –

+0

私たちの講師は、フォークを代わりに使用することを強くお勧めしました。レッグコンディションなどを心配する必要はありません。 –

答えて

2

shmgetshmatshmdet ... 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

データベースを使用すると、すべてのロック/同時実行性を解決するだろう問題。

関連する問題