剪切板,匿名管道,命名管道,邮槽 的总结
剪切板和匿名管道只能实现同一台机器上两个进程间的通信 不能跨网络
命名管道和邮槽可以跨网络
邮槽可以一对多广播(一个客户端多个服务器) 数据量小 424字节以下
命名管道 一对一 数据量可以大
服务端==========================================================
void CMy0202ADlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
HANDLE hMailslot;
//创建邮槽
hMailslot=::CreateMailslotA(
"\\\\.\\mailslot\\MyMailslot", //固定格式
0, //消息最大尺寸 0为任意大小
MAILSLOT_WAIT_FOREVER, //一直等待 如果为0则没收到消息立即返回 单位为ms
NULL //默认安全符 此参数为SECURITY_ATTIBUTES结构指针
);
if(INVALID_HANDLE_VALUE ==hMailslot)
{
::AfxMessageBox("创建邮槽失败!");
return;
}
char buf[100];
DWORD dwRead;
//从邮槽读取数据
if(!::ReadFile(hMailslot,buf,100,&dwRead,NULL))
{
::AfxMessageBox("读取数据失败!");
::CloseHandle(hMailslot);
return;
}
//::AfxMessageBox(buf);
this->GetDlgItem(IDC_EDIT1)->SetWindowTextA(buf);
::CloseHandle(hMailslot);
}
客户端==========================================================
void CclientDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
HANDLE hMailslot;
//打开邮槽
hMailslot=::CreateFileA(
"\\\\.\\mailslot\\MyMailslot",
GENERIC_WRITE, //访问方式 对于客户端,只能是写入
FILE_SHARE_READ, //共享方式 "共享读"让服务端可以从邮槽中读取数据
NULL, //指定安全描述符
OPEN_EXISTING, //打开的方式
FILE_ATTRIBUTE_NORMAL, <span style="white-space:pre"> </span>//文件属性
NULL //指定模板文件
);
if(INVALID_HANDLE_VALUE ==hMailslot)
{
::AfxMessageBox("创建邮槽失败!");
return;
}
char buf[]="此段文字来自于客户端";
DWORD dwWrite;
//向邮槽写数据
if(!::WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL))
{
::AfxMessageBox("写入数据失败");
::CloseHandle(hMailslot);
return;
}
::CloseHandle(hMailslot);
}