首页 > 代码库 > 【IPC进程间通讯之一】邮槽MailSlot

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

IPC进程间通信+邮槽MailSlot

      
        IPC(Inter-Process Communication,进程间通信)。
       现代计算机采用虚拟内存机制,为进程提供独立的足够大的地址空间,处于安全目的,一个进程不具有特殊的权限,是无法访问另一个进程的内存空间,进程间相互隔绝。进程间通信IPC就需要特别的机制来实现,邮槽MailSlot是常用的IPC方法之一。
        
       1.邮槽(MailSlot):
        
       邮槽MailSlot通信的进程分为服务端客户端。服务端创建MailSlot,创建时指定邮槽名,客户端同过邮槽名打开MailSlot。
       邮槽是单向的,服务端只能读取MailSlot,客户端只能写入MailSlot。服务端读取数据是先入先出,即先写入的数据先被读取。

        2.邮槽命名 :
        本机上格式:\\.\mailslot\[path\]name
        如:\\.mailslot\my_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
);
         第一个参数:文件指针。
         第二个参数:访问模式。
         第三个参数:共享模式。
         第四个参数:安全属性指针。
         第五个参数:创建选项。
         第六个参数:文件属性。
         第七个参数:用于复制文件句柄。
         该函数用于客户端打开Mailslot。
写入邮槽:
        BOOL  WriteFile(
                     HANDLE    hFile,
                     LPCVOID   lpBuffer,
                     DWORD     nNumberOfBytesToWrite,
                     LPDWORD   lpNumberOfBytesWritten,
                     LPOVERLAPPED    lpOverlapped
);
         第一个参数:文件句柄。
         第二个参数:数据缓冲区指针。
         第三个参数:写入字节数。
         第四个参数:返回实际写入字节数。
         第五个参数:结构体指针,一般置NULL。
         该函数用于客户端向Mailslot写入数据。

         4.牛刀小试 : 
         先在VC6.0中运行服务端程序,在运行客户端程序

        运行效果

Mailslot服务端:
<script src="https://code.csdn.net/snippets/344498.js" type="text/javascript"></script>
Mailslot客户端:
<script src="https://code.csdn.net/snippets/344501.js" type="text/javascript"></script>