说明
邮槽(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