sách gpt4 ăn đã đi

c - 两个进程之间的命名共享内存

In lại 作者:太空狗 更新时间:2023-10-29 15:38:30 28 4
mua khóa gpt4 giày nike

我正在尝试使用文件映射在 C 语言中构建客户端/服务器,它仍处于开发初期,但我在理解文件映射的确切工作原理时遇到了一些困难。

我在我的服务器上创建了一个结构的文件映射并在上面放了一些数据,然后我的客户端打开文件映射并读取数据。然后我的客户端写入数据供服务器读取,但服务器无法读取客户端数据,我不明白为什么,因为文件映射应该在两个进程之间同步。在这个阶段我仍然没有使用事件,但我认为它们不是工作所必需的(是吗?)

她是我得到的代码。

máy chủ:

struct _HBACKUPSERVICE{
DWORD dwServerProcessID;
TCHAR szWork[MAX_PATH];
HANDLE hMapFile;
};

PHBACKUPSERVICE pBuf = NULL;
HANDLE hMapFile;

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

if (/*phBackupService->*/hMapFile == NULL){
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return *pBuf;
}

pBuf = (PHBACKUPSERVICE)MapViewOfFile(
hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(HBACKUPSERVICE));

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


// Populate backup service structure
pBuf->hMapFile = hMapFile;
pBuf->dwServerProcessID = GetCurrentProcessId();

// Wait for client
do{
_tprintf(_T("\nServer: Waiting for work."));
pBuf = (PHBACKUPSERVICE)MapViewOfFile(
_BackupService.hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(HBACKUPSERVICE));
if (StringCbLength(pBuf->szWork, 1 * sizeof(TCHAR), NULL) == S_OK){ Sleep(500); }
} while (StringCbLength(pBuf->szWork, 1 * sizeof(TCHAR), NULL) == S_OK); // ERROR: pBuf->szWork is always empty...

_tprintf(_T("Work from client: %s"), pBuf->szWork);

客户:

HBACKUPSERVICE _BackupService;
HANDLE hMapFile;

hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
_T("MyService")); // name of mapping object

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

BackupService= (PHBACKUPSERVICE)MapViewOfFile(
hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(HBACKUPSERVICE));

_tprintf(_T("Server process id: %d"), _BackupService.dwServerProcessID);
_tprintf(_T("send work to server"));
StringCchCopy(_BackupService.szWork, STRSAFE_MAX_CCH, _T("Do work for me!!!!!!!!!!")); //ERROR: the server never sees this

Cảm ơn!

câu trả lời hay nhất

您的服务器在其读取循环中调用 MapViewOfFile(),因此您正在映射越来越多的指针而不是取消映射它们。最终,您将用完可用地址进行映射。摆脱那个。在进入循环之前,您应该使用已经从第一个 MapViewOfFile() 获得的 pBuf 指针。您只需映射一次 View 。

您的客户端根本没有将数据写入映射 View ,它正在写入本地 HBACKUPSERVICE 变量而不是映射 View 。这就是服务器看不到数据的原因。

试试这个:

常见的:

typedef struct _HBACKUPSERVICE {
DWORD dwServerProcessID;
TCHAR szWork[MAX_PATH];
HANDLE hMapFile;
} HBACKUPSERVICE, *PHBACKUPSERVICE;

máy chủ:

PHBACKUPSERVICE pBuf = NULL;
HANDLE hMapFile;

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

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

pBuf = (PHBACKUPSERVICE)MapViewOfFile(
hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(HBACKUPSERVICE));

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

// Populate backup service structure
pBuf->hMapFile = hMapFile;
pBuf->dwServerProcessID = GetCurrentProcessId();
ZeroMemory(pBuf->szWork, sizeof(pBuf->szWork));

// Wait for client
_tprintf(_T("\nServer: Waiting for work."));
while (pBuf->szWork[0] == 0){ Sleep(500); }

_tprintf(_T("Work from client: %s"), pBuf->szWork);

客户:

PHBACKUPSERVICE BackupService = NULL;
HANDLE hMapFile;

hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
_T("MyService")); // name of mapping object

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

BackupService = (PHBACKUPSERVICE)MapViewOfFile(
hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(HBACKUPSERVICE));

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

_tprintf(_T("Server process id: %d"), BackupService->dwServerProcessID);
_tprintf(_T("send work to server"));
StringCchCopy(BackupService->szWork, MAX_PATH, _T("Do work for me!!!!!!!!!!"));

最后,TCHAR 对于跨进程边界的互操作是危险的。想象一下,如果一个 ANSI 应用程序试图与一个 UNICODE 应用程序通信会发生什么。他们不会同意您的 szWork 字段的格式,因此不会同意您的 HBACKUPSERVICE 结构的字节大小。您应该根据需要将 TCHAR Thay thế bằng CHAR hoặc WCHAR,并在两端保持一致。

关于c - 两个进程之间的命名共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24712989/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress