注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

命名管道(Windows)  

2016-12-02 18:41:42|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
HANDLE CreateNamedPipe(
  LPCTSTR lpName,                             /*管道名称*/
  DWORD dwOpenMode,                        /*管道打开模式*/ 
  DWORD dwPipeMode,                        /*管道的模式*/ 
  DWORD nMaxInstances,                   /*管道能够创建的最多实例*/
  DWORD nOutBufferSize,                 /*输出缓存大小*/ 
  DWORD nInBufferSize,                    /*输入缓存大小*/   
  DWORD nDefaultTimeOut,                  /*管道的默认等待超时*/
  LPSECURITY_ATTRIBUTES lpSecurityAttributes  /*安全属性*/
);
创建命名管道和打开已经存在的命名管道,其中lpName为管道名称,dwOpenMode为创建方式,可以是下面值的组合: 
PIPE_ACCESS_INBOUND:管道只能用作接收数据。 
PIPE_ACCESS_OUTBOUND:管道只能用作发送数据。 
PIPE_ACCESS_DUPLEX:管道既可以发送也可以接收数据。(上面这三个值只能够取其中一个) 
FILE_FLAG_WRITE_THROUGH: 管道用于同步发送和接收数据,只有在数据被发送到目标地址时发送函数才会返回,如果不设置这个参数那么在系统内部对于命名管道的处理上可能会因为减少网络 附和而在数据积累到一定量时才发送,并且对于发送函数的调用会马上返回。 
FILE_FLAG_OVERLAPPED:管道可以用于异步输入和输出,异步读写的有关方法和文件异步读写是相同的。 
dwPipeMode指定管道类型,可以是下面值的组合: 
PIPE_TYPE_BYTE:数据在通过管道发送时作为字节流发送,不能与PIPE_READMODE_MESSAGE共用。 
PIPE_TYPE_MESSAGE:数据在通过管道发送时作为消息发送,不能与PIPE_READMODE_BYTE共用。 
PIPE_READMODE_BYTE:在接收数据时接收字节流。 
PIPE_READMODE_MESSAGE:在接收数据时接收消息。 
PIPE_WAIT:使用等待模式,在读,写和建立连接时都需要管道的另一方完成相应动作后才会返回。 
PIPE_NOWAIT:使用非等待模式,在读,写和建立连接时不需要管道的另一方完成相应动作后就会立即返回。 
nMaxInstances 为管道的的最大数量,在第一次建立服务器方管道时这个参数表明该管道可以同时存在的数量。PIPE_UNLIMITED_INSTANCES表明不对数量 进行限制。nOutBufferSizenInBufferSize表示缓冲区的大小。nDefaultTimeOut表示在等待连接时最长的等待时间 (以毫秒为单位),如果在创建时设置为NMPWAIT_USE_DEFAULT_WAIT表明无限制的等待,而以后服务器方的其他管道实例也需要设置相同 的值。lpSecurityAttributes为安全属性,一般设置为NULL。如果创建或打开失败则返回INVALID_HANDLE_VALUE。 可以通过GetLastError得到错误。 

server端先用CreateNamedPipe创建一个命名管道,然后用ConnectNamedPipe等待client端的连接,如果连接到了,则用ReadFile/WriteFile进行数据通讯;
client端首先用WaitNamedPipe尝试与server端进行连接,连接成功后,用CreateFile打开该管道,这时可以用ReadFile/WriteFile进行数据通讯了。
server端代码
#include <iostream>
#include <Windows.h>
using namespace std;

#define NAMEDPIPENAME "\\\\.\\pipe\\MIHOOKE"
int main()
{
HANDLE handle;
/*server端创建管道*/
handle = CreateNamedPipe(NAMEDPIPENAME,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
0,
0,
NMPWAIT_WAIT_FOREVER,
0);
/*等待client连接管道*/
if (ConnectNamedPipe(handle, NULL) != NULL)
{
char cBuf[100] = {0};
DWORD dwLen = 0;
/*如果连接到了,则读取管道中的数据*/
ReadFile(handle, cBuf, 100, &dwLen, NULL);
cout<<"接收到的数据是:"<<cBuf<<endl;
}
DisconnectNamedPipe(handle);
CloseHandle(handle);
system("pause");
return 0;
}

client端代码

#include <iostream>
#include <Windows.h>
using namespace std;

const char *namedPipe = "\\\\.\\pipe\\MIHOOKE";
int main()
{
HANDLE handle;
/*client主动连接该管道*/
if (WaitNamedPipe(namedPipe, NMPWAIT_WAIT_FOREVER) == FALSE)
{
cout<<"连接管道失败"<<endl;
CloseHandle(handle);
return 1;
}
/*打开管道*/
handle = CreateFile(namedPipe,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
char cBuf[100] = "This is Mihooke's apple!";
DWORD dwLen = 0;
/*写入管道中数据*/
WriteFile(handle, cBuf, 100, &dwLen, 0);
CloseHandle(handle);
return 0;
}
这里值得一提的是,CreateFile、ReadFile、WriteFile函数,看函数功能应该是对文件操作的函数啊,为什么用来操作管道呢?没错,因为管道也是一种文件,不过它不是类似txt等的可视文件,它是系统内存中的映射文件,所以这里都用这些函数。
  评论这张
 
阅读(38)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017