简介
使用邮槽通信的进程分为服务端和客户端
。邮槽由服务端创建,在创建时需要指定邮
槽名,创建后服务端得到邮槽的句柄。在邮槽创建后,客户端可以通过邮槽名打开邮槽,
在获得句柄后可以向邮槽写入消息。
邮槽通信是单向的,只有服务端才能从邮槽中读取消息
,客户端只能写入消息。消息
是先入先出的。客户端先写入的消息在服务端先被读取
。
通过邮槽通信的数据可以是任意格式的,但是一 条消息不能大于424字节。
邮槽除了在本机内进行进程间通信外,在主机间也可以通信。但是在主机间进行邮槽通
信,数据通过网络传播时使用的是数据报协议(UDP)
,所以是一种不可靠的通信。通过网
络进行邮槽通信时,客户端必须知道服务端的主机名或域名。
代码示例
发送端
void CChildView::OnSend()
{
// TODO: 在此添加命令处理程序代码
//创建一个文件句柄
LPCTSTR szSlotName=TEXT("\\\\.\\mailslot\\Mymailslot");
HANDLE hMailSlot=CreateFile(szSlotName,FILE_GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if(hMailSlot==INVALID_HANDLE_VALUE){
printf("CreateMailslot failed with %d\n",GetLastError());
return;
}
//写入数据
char szBuf[100]="Bingo is han";
DWORD dwWrite;
if(!WriteFile(hMailSlot,szBuf,strlen(szBuf+1),&dwWrite,NULL))
{
MessageBox(_T("写入数据失败"));
CloseHandle(hMailSlot);
return;
}
MessageBox(_T("写入数据成功"));
CloseHandle(hMailSlot);
}
接收端
void CChildView::OnSlot()
{
// TODO: 在此添加命令处理程序代码
// “\\\\.\\mailslot\\Mymailslot \\.\mailslot\Mymailslot
//1 创建一个邮槽
LPCTSTR szSlotName=TEXT("\\\\.\\mailslot\\Mymailslot");
HANDLE hSlot=CreateMailslot(szSlotName,
0,//no maximum message size
MAILSLOT_WAIT_FOREVER,//no time-out for operations
NULL
);//default security
if(hSlot==INVALID_HANDLE_VALUE){
printf("CreateMailslot failed with %d\n",GetLastError());
return;
}
//2 读取数据
char szBuf[100]={0};
DWORD dwRead;
if(!ReadFile(hSlot,szBuf,100,&dwRead,NULL))
{
MessageBox(_T("读取数据失败"));
CloseHandle(hSlot);
return;
}
MessageBox((CStringW)szBuf);
CloseHandle(hSlot);
}
效果展示