0
点赞
收藏
分享

微信扫一扫

随想录(基于内存映射的进程通信)

mm_tang 2022-11-23 阅读 111


    在通信协议的开发中,有的时候为了本地调试的需要,需要实现进程之间的通信。在windows系统中,进程通信的方式很多,比如说有管道通信、内存映射、socket通信、剪切板通信等等。但是,其中,我认为最好的方式还是内存映射的方式,简单、明了。因为通信的数据是被很多进程共享的,所以必要的互斥措施是非常必要的。只要处理好互斥的关系,内存映射可以为我们做好不少事情。


     在内存映射中,所需要的基本函数其实非常简单:(1)创建文件映射,即函数CreateFileMapping;(2)打开文件映射,即函数OpenFileMapping;(3)关闭文件映射,即函数UnmapViewOfFile。名称是server和client识别的唯一媒介。下面就是一个范例,贴出来的代码是一个简单的服务端和客户端代码,略带修改。源代码来自于《精通Windows API,函数、接口、编程实例》,请注意版权声明。


    服务端代码如下所示,

#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define BUF_SIZE 256

LPTSTR szName = TEXT("mapObject");
LPTSTR szMsg = TEXT("msg");


void main(int argc, char* argv[])
{
HANDLE hMapFile;
LPTSTR pBuf;

hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
BUF_SIZE,
szName
);

if(hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
return;
}

pBuf = (LPSTR)MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
BUF_SIZE);

if(NULL == pBuf)
{
return ;
}

CopyMemory(pBuf, szMsg, strlen(szMsg));
getch();

UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}


   

客户端代码如下,

#include <windows.h>
#include <stdio.h>
#include <conio.h>

#pragma comment (lib, "User32.lib")
#define BUF_SIZE 256

LPTSTR szName = TEXT("mapObject");

void main(int argc, char* argv[])
{
HANDLE hMapFile;
LPTSTR pBuf;

hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
FALSE,
szName
);

if(hMapFile == NULL )
{
return ;
}

pBuf = (LPSTR)MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
BUF_SIZE);

if(NULL == pBuf)
{
return ;
}

printf(pBuf);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}

 

 

举报

相关推荐

0 条评论