/*
命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信 与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据
我们可以通过
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 ;
}
}