【IPC进程间通讯之中的一个】邮槽MailSlot

IPC进程间通信+邮槽MailSlot

      
        IPC(Inter-Process Communication。进程间通信)。
       现代计算机採用虚拟内存机制,为进程提供独立的足够大的地址空间。处于安全目的,一个进程不具有特殊的权限。是无法訪问还有一个进程的内存空间,进程间相互隔绝。进程间通信IPC就须要特别的机制来实现。邮槽MailSlot是经常使用的IPC方法之中的一个。

        
       1.邮槽(MailSlot):
        
       邮槽MailSlot通信的进程分为服务端client。服务端创建MailSlot,创建时指定邮槽名,client同过邮槽名打开MailSlot。
       邮槽是单向的,服务端仅仅能读取MailSlot,client仅仅能写入MailSlot。服务端读取数据是先入先出,即先写入的数据先被读取。


        2.邮槽命名 :
        本机上格式:\.mailslot[path]name
        如:\.mailslotmy_mailslot

       3.基本API函数
创建邮槽
        HANDLE  CreateMailSlot(
                          LPCTSTR  lpName,
                          DWORD     nMaxMessageSize,
                          DWORD     lReadTimeout,
                          LPSECURITY_ATTRIBUTES   lpSecurityAttributes );
        第一个參数:邮槽名。
        第二个參数:最大消息长度。
        第三个參数:读取超时,设为0时。没有消息马上返回。MAILSLOT_WAIT_FORVER时,一直等待消息。
        第三个參数:安全属性,一般设为NULL。

        该函数创建一个Mailslot。并返回该邮槽的句柄。

读取邮槽:       
        BOOL ReadFile(
                   
HANDLE    hFile,
                    LPVOID     lpBuffer,
                    DWORD    nNumberOfBytesToRead,
                    LPDOWRD    lpNumberOfBytesRead,
                    LPOVERLAPPED   lpOverlapped
)。
        第一个參数:邮槽句柄。
        第二个參数:缓存地址。

        第三个參数:消息的长度。

        第四个參数:实际读取的长度。
        第五个參数:一般设置为NULL。
        该函数用于读取邮槽内数据。
打开邮槽:
        BOOL  CreateFile(
                     LPCTSTR   lpFileName,
                     DWORD     dwDesiredAccess,
                     DWORD     dwShareMode,
                     LPSECURITY_ATTRIBUTES   lpSecurityAttributes,
                     DWORD    dwCreationDisposition,
                     DWORD    dwFlagsAndAttributes,
                    HANDLE    hTemplateFile
);
         第一个參数:文件指针。
         第二个參数:訪问模式。
         第三个參数:共享模式。

         第四个參数:安全属性指针。
         第五个參数:创建选项。
         第六个參数:文件属性。
         第七个參数:用于拷贝文件句柄。
         该函数用于client打开Mailslot。
写入邮槽:
        BOOL  WriteFile(
                     HANDLE    hFile,
                     LPCVOID   lpBuffer,
                     DWORD     nNumberOfBytesToWrite,
                     LPDWORD   lpNumberOfBytesWritten,
                     LPOVERLAPPED    lpOverlapped
);
         第一个參数:文件句柄。
         第二个參数:数据缓冲区指针。
         第三个參数:写入字节数。
         第四个參数:返回实际写入字节数。
         第五个參数:结构体指针。一般置NULL。

         该函数用于client向Mailslot写入数据。


         4.牛刀小试 : 
         先在VC6.0中执行服务端程序,在执行client程序

        执行效果

Mailslot服务端:
#include 
#include 
/* 全局变量 */
HANDLE hSlot;
//邮槽名
LPTSTR lpszSlotName = TEXT("\\.\mailslot\sample_mailslot");
void main()
{ 
	DWORD  cbRead; 
	char lpszBuffer[256]=" ";  
	
    //创建邮槽
	hSlot = CreateMailslot(
		lpszSlotName,		        // mailslot 名
		0,							// 不限制消息大小 
		MAILSLOT_WAIT_FOREVER,      // 无超时 
		(LPSECURITY_ATTRIBUTES) NULL); 
	printf("Mailslot 创建成功!
");

	while(1)
	{

			// 读取消息
			ReadFile(hSlot,	    // mailslot句柄
	        lpszBuffer,			// 缓存
			256,			    // 消息的长度
			&cbRead,			// 实际读取的长度
			NULL); 

			// 显示
			printf("Data from the mailslot: %s
", lpszBuffer); 

	}
	return ; 
}
Mailslotclient:
#include 
#include 
/* 全局变量 */
HANDLE hSlot;
LPTSTR lpszSlotName = TEXT("\\.\mailslot\sample_mailslot");		// mailslot名
void main()
{ 
	HANDLE hFile; 
	DWORD cbWritten; 
    char *send_data="I from client!";

	// 打开mailslot
	hFile = CreateFile(lpszSlotName, 
		GENERIC_WRITE,		// 可写
		FILE_SHARE_READ,
		(LPSECURITY_ATTRIBUTES) NULL, 
		OPEN_EXISTING,		// 打开一个已经存在的mailslot,应该由服务端已经创建
		FILE_ATTRIBUTE_NORMAL, 
		(HANDLE) NULL); 


	// 向mailslot写入
	WriteFile(hFile, 
		send_data, 
		(DWORD) (lstrlen(send_data)+1)*sizeof(TCHAR),  
		&cbWritten, 
		(LPOVERLAPPED) NULL); 


	// 结束
	printf("Data written:%s
",send_data); 
	CloseHandle(hFile); 
	return ;
}


【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/ldxsuanfa/p/10701336.html