2015-05-16 3 views
-1

В настоящее время я работаю над проектом игры Bomberman, где должен быть Сервер с двумерной матрицей и 1 или более Клиентов.Общая память - матричное отображение

Способ, которым, по моему мнению, должен быть выполнен, заключается в использовании общей памяти между процессом, когда клиенты и «враги» получают доступ к информации о таблице (матрице) и работают с этим.

Проблема в том, что я не знаю, как сопоставить указатель на мой объект Map (матрица), чтобы другие процессы могли захватить эту информацию.

Я получил эту функцию из MSDN, но я только объяснить строку:

//Server.cpp 

    //object creation (Matrix) 
    Mapa M(height, width); 

    hMapFile = CreateFileMapping(
      INVALID_HANDLE_VALUE, // use paging file 
      NULL,     // default security 
      PAGE_READWRITE,   // read/write access 
      0,      // maximum object size(high-order DWORD) 
      BUF_SIZE,    // maximum object size (low-order DWORD) 
      szName);    // name of mapping object 

if (hMapFile == NULL) 
{ 
    _tprintf(TEXT("Could not create file mapping object (%d).\n"), 
     GetLastError()); 

    return 1; 
} 

**HANDLE hMapFile = &M; // will this work?** 

pBuf = (LPTSTR) MapViewOfFile(hMapFile, // <- How can I pass the object here? 
        FILE_MAP_ALL_ACCESS, // read/write permission 
        0, 
        0, 
        BUF_SIZE); 

if (pBuf == NULL) 
{ 
     _tprintf(TEXT("Could not map view of file (%d).\n"), 
     GetLastError()); 

    CloseHandle(hMapFile); 

    return 1; 

}

Пожалуйста, как я могу карту указателя на объект или даже к объекту так другим процессы могут получить доступ?

С уважением,

RC

+1

«CreateFileMapping» - это только один шаг на пути к общей памяти, другой - ['MapViewOfFile'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366761%28v=vs.85%29.aspx) – Diego

+0

Да, но как я могу указать объект матрицы? – falkon21

+2

Этот проект ограничит работу вашего клиента и сервера на том же компьютере. Как правило, клиент и сервер будут работать в отдельных блоках и обмениваться данными через TCP/IP. Почему вы используете общую память? – StilesCrisis

ответ

2

Чтобы использовать отображение файла код сервера должен выглядеть следующим образом. Обратите внимание, что я не проверяю на наличие ошибок, чтобы сохранить опубликованный код простым (всегда проверяйте наличие ошибок!).

/* server */ 
HANDLE hFile; 
HANDLE hMapFile; 

hFile = CreateFile("test.dat", 
        GENERIC_READ | GENERIC_WRITE, 
        0, 
        NULL, 
        OPEN_EXISTING, 
        FILE_ATTRIBUTE_NORMAL, 
        NULL); 
hMapFile = CreateFileMapping(hFile, 
          NULL, 
          PAGE_READWRITE, 
          0, 
          1024 * 1024, 
          "test.mapping"); // "mapping file name" of "test.dat" 

/* keep server process running and do not close hFile or hMapFile */ 

И ваш клиент должен выглядеть примерно так:

/* client */ 
HANDLE hMapFile; 
char *pFile; // note: you can use any type of pointer here! 

hMapFile = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, 
          FALSE, 
          "test.mapping"); // same name as within CreateFileMapping(..) 
if (hMapFile != NULL) 
{ 
    pFile = MapViewOfFile(hMapFile, 
          FILE_MAP_ALL_ACCESS, 
          0, 
          0, 
          1024 * 1024); 

    /* read pFile */ 
    printf(pFile); 

    /* write pFile */   
    wsprintf(pFile, "Hallo?"); // <-- writes to test.dat!! 
} 

Как было отмечено выше, этот проект будет иметь некоторые недостатки, если они используются для архитектуры клиент/сервер. Я рекомендую использовать сервер/клиент TCP/IP, который не сложнее реализовать, чем именованные каналы. Хорошее место для начала было бы Running the Winsock Client and Server Code Sample, но есть множество других примеров в Интернете ...

При использовании TCP/IP вашего приложения будет выглядеть примерно так:

/* server */ 

// create listener socket 

// while running 

    // accept new client(s) 

    // receive data from clients (if any data was received) 

    // react on data: (client sent 0x01 -> send matrix, ...) 



/* client */ 

// create socket and connect to server 

// send 0x01 command to obtain matrix 

// receive response from server (= get matrix) 

// do whatever your client does... 

Обратите внимание, что 0x01 является простой командный байт, чтобы сообщить серверу, что делать. Вы совершенно свободны в том, как сообщить серверу, что делать. Вы можете также реализовать командный интерфейс на основе строк (например, клиент отправляет «get_matrix» вместо 0x01) ...

Смежные вопросы