命名管道

命名管道

命名管道通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信。

将命名管道作为一种网络编程方案时,它实际上建立了一个客户机 /服务器通信体系,并在其中可靠地传输数据。命名管道服务端是唯一一个有权创建命名管道的进程,也只有它才能接受管道客户端的连接请求,而客户端只能同一个现成的服务端建立连接。

主要函数

CreateNamedPipe();--创建一个命名管道的实例,并返回该命名管道的句柄
ConnectNamedPipe();--让服务端等待客户端的连接请求(函数的命名不太好,给人的直觉好像是去连接服务端的命名管道)
WaitNamedPipe();--判断是否有可以利用的命名管道,该函数会一直等待,直到指定的超时时间已过,或者指定的命名管道的实例可以用来连接了
CreateFile();--打开命名管道
ReadFile();--读取数据
WriteFile();--写入数据

主要代码

1)服务端
void CNamedPipeSrvView::OnPipeCreate()
{
// TODO: 在此添加命令处理程序代码
//创建命名管道
hPipe=CreateNamedPipe("\\\\.\\pipe\\MyPipe",PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,0,1,1024,1024,0,NULL);
if(hPipe==INVALID_HANDLE_VALUE)
{
AfxMessageBox("创建命名管道失败!");
hPipe=NULL;
return;
}
//创建匿名的人工重置事件对象
HANDLE hEvent =NULL;
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!hEvent)
{
AfxMessageBox("创建事件对象失败!");
CloseHandle(hPipe);
hPipe=NULL;
return;
}
OVERLAPPED ovlap;
ZeroMemory(&ovlap,sizeof(OVERLAPPED));
ovlap.hEvent=hEvent;
//等待客户端请求的到来
if(!ConnectNamedPipe(hPipe,&ovlap))
{
if(GetLastError()!=ERROR_IO_PENDING)
{
AfxMessageBox("等待客户端连接失败!");
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe=NULL;
return;
}
}
if(WaitForSingleObject(hEvent,INFINITE)==WAIT_FAILED)
{
AfxMessageBox("等待事件对象失败!");
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe=NULL;
return;
}
CloseHandle(hEvent);
}

void CNamedPipeSrvView::OnPipeRead()
{
// TODO: 在此添加命令处理程序代码
char buf[100]={0};
DWORD dwRead;
if(!ReadFile(hPipe,buf,100,&dwRead,NULL))
{
AfxMessageBox("读取数据失败!");
return;
}
AfxMessageBox(buf);
}

void CNamedPipeSrvView::OnPipeWrite()
{
// TODO: 在此添加命令处理程序代码
char buf[]="www.baidu.com";
DWORD dwWrite;
if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
{
AfxMessageBox("写入数据失败!");
return;
}
}

2) 客户端
void CNamedPipeCltView::OnPipeConnect()
{
// TODO: 在此添加命令处理程序代码
//判断是否有可以利用的命名管道
if(!WaitNamedPipe("\\\\.\\pipe\\MyPipe",NMPWAIT_WAIT_FOREVER)) // \\.\pipe\MyPipe:圆点表示服务端进程在本地机器上运行,如果是跨网络通信,则在这个圆点位置处应指定服务端程序所在的主机名
{
AfxMessageBox("当前没有可以利用的命名管道实例!");
return;
}
//打开可用的命名管道,并与服务端进程进行通信
hPipe=CreateFile("\\\\.\\pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hPipe==INVALID_HANDLE_VALUE)
{
AfxMessageBox("打开命名管道失败!");
hPipe=NULL;
return;
}
}

void CNamedPipeCltView::OnPipeRead()
{
// TODO: 在此添加命令处理程序代码
char buf[100]={0};
DWORD dwRead;
if(!ReadFile(hPipe,buf,100,&dwRead,NULL))
{
AfxMessageBox("读取数据失败!");
return;
}
AfxMessageBox(buf);
}

void CNamedPipeCltView::OnPipeWrite()
{
// TODO: 在此添加命令处理程序代码
char buf[]="命名管道测试程序";
DWORD dwWrite;
if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
{
AfxMessageBox("写入数据失败!");
return;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值