孙鑫 第十七课进程间通信之四 邮槽

说明

邮槽(Mailslot)通信是基于无连接的不可靠的,单向,服务器进程(创建邮槽的进程)只能接收信息,客户进程只能发送信息。

如果要实现双向通信,可以在两个进程中各创建一个邮槽来进行通信。

 

需要注意的地方

服务器近进程中接收信息时用ReadFile函数,文件句柄为创建的邮槽句柄。

客户进程中发送消息用的WriteFile函数,文件句柄为用CreateFile函数创建的文件句柄,同时在创建文件时也要注意共享模式,

由于要在服务器进程中读取消息,因此共享模式为读共享!   对象的控制模式为写控制!

 

函数和数据结构

①创建邮槽

HANDLE  CreateMailslot(

LPCTSTR  lpName,   //邮槽名,唯一的,格式:\\.\mailslot\[path]name其中"."标识本地主机

DWORD     nMaxMessageSize, //消息最大尺寸,超过这个尺寸的服务进程不接收,为0标识任意尺寸

DWORD     lReadTimeout,  //超时值, 为0表示读操作立即返回,此超时值为读操作的超时值

LPSECURITY_ATTRIBUTES  lpSecurityAttributes  //安全属性, 为NULL表示默认安全属性

);

 

说明:失败返回INVALID_HANDLE_VALUE。

 

eg.

HANDLE  hMailslot = INVALID_HANDLE_VALUE;

const char* mailslotName = "\\\\.\\mailslot\\MyMailslot";

hMailslot = CreateMailslot(mailslotName, 0, 0, NULL); //任意尺寸,读操作立即返回,默认安全属性


if(INVALID_HANDLE_VALUE == hMailslot)

{

    MessageBox(_T("创建邮槽失败!"));

    return;

}


 

②服务器进程读

char readBuf[400];

memset(readBuf, '\0', sizeof(readBuf));

DWORD length = 0;

ReadFile(hMailslot, readBuf, sizeof(readBuf), &length, NULL);


 

③客户进程写

HANDLE  hFile = INVALID_HANDLE_VALUE;

const char* fileName = "\\\\.\\mailslot\\MyMailslot";  //文件名为服务器进程创建的邮槽名

hFile = CreateFile(

fileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL

);   //写控制,读共享,已存在


if(INVALID_HANDLE_VALUE == hFile)

{

    MessageBox(_T("创建文件失败!"));

    return;

}


char writeBuf[] = "hello server!";

DWORD length = 0;

WriteFile(hFile, writeBuf, sizeof(writeBuf), &length, NULL);



NOTE:

如果要实现双向通信,可以在上面客户进程中再创建一个邮槽(略)。


百度文库一篇对CreateFile函数的详解http://wenku.baidu.com/view/bd68958984868762caaed516.html

 

孙鑫 第十七课进程间通信之四  邮槽 - 大灰狼 - 大灰狼 的博客

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值