利用命名管道实现进程之间的通信 .........

/*
命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信 与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据
我们可以通过
CreateNamedPipe()创建一个管道 ,可以指定模式是双向 即客户端 和服务端都可以进行读写 管道 就跟基于 socket的TCP通信类似
在服务端调用ConnectNamedPipe()来等待客户端连接管道 ,不像函数英文名字那样连接管道 而是等地啊客户端连接的到来

在客户端我们需要调用 WaitNamedPipe()函数来连接管道

在完成以上的工作之后 我们就可以利用 CreateFile() ReadFile() WriteFile()进行进程之间的通信了

在 油槽 命名管道 磁盘文件的读写 的时候我们都用到了 CreateFile() ReadFile() WriteFile() 一样的函数 来进行操作
*/

///服务端
#include <iostream>
#include "windows.h"
#include <string>
using namespace std ;
void main()
{
HANDLE hNamedPipe=::CreateNamedPipe("\\\\.\\pipe\\path", //管道名称 如果是不同主机需要吧.换成主机名字 或者直接换成*就可以实现全网内部的通信
PIPE_ACCESS_DUPLEX, //管道可以双向通信
PIPE_TYPE_BYTE,//数据以字节流的方式写入管道
PIPE_UNLIMITED_INSTANCES, //表示管道能够创建的最大实例数目 这里只和操作系统相关
1024, //输出缓冲区大小
1024,//输入缓冲区大小
0,//超时间隔
NULL//默认安全结构
) ;
OVERLAPPED ov={0} ; //定义一个OVERLAPPED结构体 并初始化为 0
::ConnectNamedPipe(hNamedPipe,&ov);
char buf[100] ;
DWORD len ;
string s ;
while(1)
{
ReadFile(hNamedPipe,(void*)buf,100,&len,NULL) ; //如果连接到来了 那么我们就从管道读取数据
cout<<"客户端说:"<<buf<<endl ;
cout<<"请输入发送给客户端的数据:"<<endl ;
cin>>s;
cout<<s<<endl ;
WriteFile(hNamedPipe,(void*)s.c_str(),s.length()+1,&len,NULL);
}


}

//客户端

#include <iostream>
#include "windows.h"
using namespace std ;
void main()
{

if(!::WaitNamedPipe("\\\\.\\pipe\\path",NMPWAIT_WAIT_FOREVER) ) //连接管道
{
cout<<"连接管道失败!"<<endl ;
return ;
}

HANDLE h1=::CreateFile("\\\\.\\pipe\\path",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL) ; //打开管道
char buf[100] ;
DWORD len ;
while(1)
{
cout<<"请输入要写入的数据:"<<endl ;
cin>>buf ;
WriteFile(h1,(LPVOID)buf,strlen(buf)+1,&len,NULL) ;
ReadFile(h1,(LPVOID)buf,100,&len,NULL) ;
cout<<"服务器说:"<<buf<<endl ;
}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值