【发布时间】:2015-11-24 18:31:19
【问题描述】:
开发游戏(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。
上面的链接显示了如何将其应用于偏移量的清晰示例。
【问题讨论】:
标签: c client-server offset file-mapping