注意:邮槽只能实现单向通信。
第一部分:服务端创建邮槽写入数据void CMailslotSDlg::OnBnClickedButtonRecv()
{
// TODO: 在此添加控件通知处理程序代码
m_btnRecv.EnableWindow(false);
m_btnRecv.SetWindowTextW(_T("等待数据到来..."));
//创建邮槽
HANDLE hMailslot;
hMailslot=CreateMailslot(_T("\\\\.\\mailslot\\MyMailsolt"),0,MAILSLOT_WAIT_FOREVER,NULL);
if(!hMailslot){
AfxMessageBox(_T("创建邮槽失败"));
m_btnRecv.EnableWindow(true);
m_btnRecv.SetWindowTextW(_T("接收"));
return;
}
//读取数据
TCHAR buf[400];
ZeroMemory(buf,400);
DWORD dwRead;
if(!ReadFile(hMailslot,buf,400,&dwRead,NULL)){
AfxMessageBox(_T("读取数据失败"));
m_btnRecv.EnableWindow(true);
m_btnRecv.SetWindowTextW(_T("接收"));
CloseHandle(hMailslot);
return;
};
//写入编辑框
SetDlgItemText(IDC_EDIT_RECV,buf);
CloseHandle(hMailslot);
m_btnRecv.EnableWindow(true);
m_btnRecv.SetWindowTextW(_T("接收"));
}
第二部分:客户端读取邮槽中的数据
void CMailslotCDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE hMailslot;
hMailslot=CreateFile(_T("\\\\.\\mailslot\\MyMailsolt"),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hMailslot==INVALID_HANDLE_VALUE){
AfxMessageBox(_T("打开邮槽失败"));
return;
}
//写邮槽数据
TCHAR buf[400];
ZeroMemory(buf,400);
GetDlgItemText(IDC_EDIT_SEND,buf,400);
DWORD dwWrite;
if(!WriteFile(hMailslot,buf,400,&dwWrite,NULL)){
AfxMessageBox(_T("写邮槽数据失败"));
CloseHandle(hMailslot);
return;
};
CloseHandle(hMailslot);
}
实现效果:
服务端点击接收按钮等待客户端发送数据的到来,数据到来后写入到编辑框中。
以上代码生成的可执行文件:
|