`
tempsitegoogle
  • 浏览: 867997 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】


在通信协议的开发中,有的时候为了本地调试的需要,需要实现进程之间的通信。在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);
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics