进程/网络通信之邮槽Mailslot的实现原理与核心逻辑
注意:邮槽只能实现单向通信。第一部分:服务端创建邮槽写入数据
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;
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;
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);
}
实现效果:
服务端点击接收按钮等待客户端发送数据的到来,数据到来后写入到编辑框中。
以上代码生成的可执行文件:
说得好,学计算机学的不仅仅是计算机,好的数学基础也是必不可少的 其实很多人都懂编程,但不是很精通。我也没有找到工作。我可那还没有你精。我是说VC。我学VB4年了。我QQ162252487。 确实不错!很负责哟! 不错,这篇文章 写得真好,是学习的榜样在失败中认识自己,在失败中寻找自己,在失败中战胜自己.你的故事给我的感受就是:我们是菜,但我们一定能做的更好 我 是刚学这门课的,当我看到这以后,震惊了,一个程序的设计是如此的复杂,我想我也是时候奋斗了,愿所有的程序设计人员都能步入高手之列 突想起伯苓师的一句话“中国不亡有我在” 奋发图强,创造中国人的辉煌 不错! 谢谢!人的一生中,能够多遇上几个这样的人,那么世界上很多很多的人,将会少走很多很多的路。 谢谢你们的留言 ,我看过深感领悟,想不到能在网上看到一些原本上书本看不到的东西。。。。