设为首页 加入收藏

TOP

进程间通信――命名管道和邮槽(二)
2014-11-23 23:30:04 来源: 作者: 【 】 浏览:5
Tags:进程 通信 命名 管道
***************************************************
判断是否有可利用的命名管道实例
************************************************************/
if(!WaitNamedPipe("\\\\.\\pipe\\MyPipe",NMPWAIT_WAIT_FOREVER))
{
MessageBox("当前没有可利用的命名管道实例");
return;
}
/**********************************************************
打开命名管道
************************************************************/
hPipe=CreateFile("\\\\.\\pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (INVALID_HANDLE_VALUE==hPipe)
{
MessageBox("打开管道失败!");
hPipe=NULL;
return;
}

(2)往管道进行读写操作

void CNamedPipeCltView::OnPipRead()
{
// TODO: Add your command handler code here
char buf[200];
DWORD dwRead;
if(!ReadFile(hPipe,buf,200,&dwRead,NULL))
{
MessageBox("读取匿名管道失败!");
return;
}
MessageBox(buf);
}


void CNamedPipeCltView::OnPipWrite()
{
// TODO: Add your command handler code here
char buf[]="乘风736博客园 http://www.cnblogs.com/chengfeng736";

DWORD dwWrite;
if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
{
MessageBox("写匿名管道失败!");
return;
}
}

运行结果如下:

\

这样,一个通过命名管道进行通信的服务器和客户端程序就设计好了。两个进程就可以实现通信了。

二 、邮槽

邮槽是基于广播模式的单向通信方式,服务器只能从邮槽读取数据,客户端只能往邮槽写入数据,而且利用邮槽通信的信息量不能太大。下面介绍利用邮槽进行进程通信的过程:

(一)服务器

(1)创建油槽

创建油槽可调用CreateMailslot()函数实现,该函数的第一个参数按照指定格式指定油槽的名字,第三个参数指定读操作等待的时间。下面的示例程序我设定读操作一直等待(MAILSLOT_WAIT_FOREVER),只到接收到数据为止。示例代码如下:

HANDLE hMailslot;
hMailslot=CreateMailslot("\\\\.\\mailslot\\MyMailslot",0,MAILSLOT_WAIT_FOREVER,NULL);
if (INVALID_HANDLE_VALUE==hMailslot)
{
MessageBox("创建邮槽失败!");
CloseHandle(hMailslot);
return;
}

(2)读取数据

DWORD dwRead;
char buf[200];
if(!ReadFile(hMailslot,buf,200,&dwRead,NULL))
{
MessageBox("读取数据失败!");
CloseHandle(hMailslot);
return;
}
MessageBox(buf);
CloseHandle(hMailslot);

(二)客户端

(1)打开油槽

CreateFile()函数不仅可以打开文件、管道还可以打开油槽。示例代码如下:

HANDLE hMailslot;
hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (INVALID_HANDLE_VALUE==hMailslot)
{
MessageBox("打开邮槽失败!");
CloseHandle(hMailslot);
return;
}

(2)写入数据

char buf[]="使用邮槽进行进程间通信\r\n乘风736博客园 http://www.cnblogs.com/chengfeng736";

DWORD dwWrite;
if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,0))
{
MessageBox("写入数据失败!");
CloseHandle(hMailslot);
return;
}
CloseHandle(hMailslot);

运行结果如下:

\

使用油槽通信的实现是很简单的。油槽只能单向通信,如果要实现双向通信,可以在客户端和服务器分别实现读写操作就可以了

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在英文字符串中找第一个最长不含.. 下一篇一步一步写算法(开篇)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: