地震往哪躲[ZT]
2008-05-13 22:19
225 查看
/*
命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信 与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据
我们可以通过
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 ;
}
}
命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信 与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据
我们可以通过
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 ;
}
}
相关文章推荐
- 成都:地震中那些感人的小事(zt)
- [ZT]代码地震(作者:王咏刚 2004 年1 月)
- 如何来进行程序的安全测试? ZT
- 黑盒测试--小技巧 ZT
- SQL Server事务全攻略(ZT)
- [zt]petshop4.0 详解之八(PetShop表示层设计)
- 实例讲解如何实现互联网上数据库的安全 ZT
- History(历史)命令用法 15 例 [zt]
- 爱情编程(ZT)
- Debian下Apache2配置指令 二 ZT
- 二十个经典 ZT
- [ZT]DataGrid中TextBox的onChange事件解决方法
- [ZT]网站盈利模式分析总结十条
- 没有完全解决的编码问题:asp和utf-8编码(ZT)
- [zt]鸟巢、水立方:同一个地方,同一梦想
- ZT:华为牛人在华为工作十年的感悟
- 推荐两个非常好用的测试工具jmeter和badboy ZT
- [zt]如何将数据导入到 SQL Server Compact Edition 数据库中(五)
- 二行代码解决全部网页木马(含iframe/script木马)(zt)
- 什么是交通信息频道:TMC -zt