开发游戏(PT 中的“jogo”),服务器最多可以同时托管 5 个游戏,客户端将通过映射内存访问这些游戏。
所以这就是我所拥有的:
服务器:
#define MAX_JOGOS 5
typedef struct{
...
} sJogo;
typedef struct{
sJogo * pS;
} sGlobals;
sJogo jogo[MAX_JOGOS]; //global
sGlobals globals[MAX_JOGOS]; //global
HANDLE hMapFile; //global
int _tmain(int argc, LPTSTR argv[]) {
...
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(sJogo)*MAX_JOGOS, szName);
//create map for all games
....
}
//called when new game is created
void createView(int index){
//create view for 1 game and store pointer
//### need to apply offset here ###
globals.pS[index] = (sJogo * )MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(sJogo);
}
//called by thread on event set
void CopyJogo(int index){
//use stored pointer to update jogo
CopyMemory((PVOID)globals[index].pS, &jogo[index], sizeof(sJogo));
}
客户:
HANDLE hMapFile; //global
sJogo * pS; //global
int _tmain(int argc, LPTSTR argv[]) {
...
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
pS = (sJogo *)MapViewOfFile(cdata.hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(sJogo));
//### need respective offset here ###
}
我尝试创建“sizeof(sJogo)*MAX_JOGOS”的视图,然后增加指针+=sizeof(sJogo) * index; 但没有成功,所以现在我求助于你,你能帮我学习使用偏移量吗?
我一直在不断地搜索,并在 stackoverflow 上找到了一个很好的例子,但它是 C++,我无法适应它。
高阶 DWORD 偏移量是 sizeof(sJogo) 正确的吗?但我不知道粒度是什么或如何将其应用于低阶 DWORD ......
你能帮助我吗?谢谢你。
编辑:
下面的代码在 i = 1 (NULL) 时返回,我做错了什么?
int _tmain(int argc, LPTSTR argv[]) {
....
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(sJogo)*MAX_JOGOS, szName);
if (hMapFile == NULL)
{...}
DWORD offset = 0;
for (i = 0; i < MAX_JOGOS; i++) {
if (MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, offset, sizeof(sJogo)) == NULL)
{
_tprintf(TEXT("Erro MapViewOfFile I: %d\n"), i);
CloseHandle(hMapFile);
return;
}
offset += sizeof(sJogo);
}
}
编辑2:
解决了上面的问题,在这里找到了解决方案:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366548%28v=vs.85%29.aspx
我没有考虑偏移量的分配粒度,这导致 MapViewOfFile 在第二次尝试时返回 NULL。
上面的链接显示了一个关于如何将其应用于偏移量的清晰示例。