您的位置:首页 > 其它

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

2011-11-14 18:36 513 查看
/*

命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信 与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据

我们可以通过

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 ;

}



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: