Windows 之命名管道(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012175637/article/details/80267163

什么是命名管道?

命名管道是一种简单的进程间通信机制。这里就不贴官方的说法了,说一下我自己的理解吧。命名管道就像一个顶级的大佬,和很多菜鸟,这个大佬告诉菜鸟们自己的家在哪里,如果你们有事可以负责来找我,我会帮你们处理,但是不会主动去找你们询问你们有什么事情,然后大佬就在家里等着了,如果菜鸟有事情,就找一条路去找大佬,解决完了就关闭这条路,当大佬想退休不干的时候,就把自己家的地址给删除了。

如何创建命名管道?

HANDLE WINAPI CreateNamedPipe(

  LPCTSTR lpName, // pipe name

  DWORD dwOpenMode, // read/write access (只读,只写,双向)

  DWORD dwPipeMode, //

  DWORD nMaxInstances, // number of instances(默认为255)

  DWORD nOutBufferSize, // output buffer size(0 表示使用默认大小)

  DWORD nInBufferSize, // input buffer size(0 表示使用默认大小)

  DWORD nDefaultTimeOut, //client time-out

  LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

函数返回值:

函数执行成功返回命名管道的句柄,否则返回INVALID_HANDLE_VALUE

创建之后记得检查句柄的返回值,如果句柄创建失败,可以使用GetLastError() 函数返回错误值,查找失败的原因。

 

如何使用命名管道?

命名管道的最大特点就是建立了一个基于服务器/客户机的程序设计体系。在这个体系结构中,数据既可以单向流动,也可以双向流动。但是服务器是唯一一个有权利创建命名管道的进程,也只有它有权利接受来自客户端的链接请求。

  服务器的实现过程

  CreateNamedPipe();//创建命名管道实例句柄

  ConnectNamedPipe();//监听来自客户机的链接请求

  ReadFile(),WriteFile();//读写数据

  DisconnectNmaePipe();//关闭命名通道连接

  CloseHandle();//关闭命名管道实例句柄

  客户端实现过程

  WaitNamedPipe();// 等候一个命名管道实例可供自己使用

  CreateFile();// 建立与命名管道的连接

  WriteFile(); ReadFile();//读写数据

  CloseHandle();// 关闭命名管道会话

具体的使用流程:

1. 服务端用CreateNamedPipe创建一个命名管道并使用ConnectNamedPipe等待客户端的连接。

2. 客户端使用WaitNamedPipe连接成功后,用CreateFile打开管道并使用WriteFile向管道中写入一段数据(即向服务端发送消息)。

3. 服务端使用ReadFile从管道中读取数据后(即收到消息)再向管道中写入确认信息表明已经收到客户端传输的数据(即通知客户端已收到)。

4. 客户端收到确认信息后结束,调用CloseHandle关闭管道(该管道是CreateFile打开的)。

5.服务端使用DisconnectNamedPipeCloseHandle关闭管道

 

涉及到的其它函数

ConnectNamedPipe

函数原型:

BOOL WINAPI ConnectNamedPipe(

   HANDLE hNamedPipe, // 命名管道句柄

   LPOVERLAPPED lpOverlapped //一般置为NULL

);

 

WaitNamedPipe

函数原型:

BOOL WINAPI WaitNamedPipe(

   LPCTSTR lpNamedPipeName, //命名管道句柄

   DWORD nTimeOut //一个实例的超时时间,可以设置为无限大

);

 

CreateFile

函数原型:

BOOL WINAPI CreatePipe(

   PHANDLE hReadPipe, //读取端句柄

   PHANDLE hWritePipe, //写入端句柄

   LPSECURITY_ATTRIBUTES lpPipeAttributes, //安全属性

  DWORD nSize //缓冲区大小,0表示使用默认大小

);

 

WriteFile

函数原型:

BOOL WriteFile(

   HANDLE hFile, //句柄

   LPCVOID lpBuffer, //指向缓冲区的指针

  DWORD nNumberOfBytesToWrite,

   LPDWORD lpNumberOfBytesWritten,

   LPOVERLAPPED lpOverlapped //指定同步操作还是异步操作

);

 

ReadFile

函数原型:

BOO L ReadFile(

   HANDLE hFile, //句柄

   LPVOID lpBuffer, //指向缓冲区的指针

   DWORD nNumberOfBytesToRead,

   LPDWORD lpNumberOfBytesRead,

   LPOVERLAPPED lpOverlapped //指定同步操作还是异步操作

);

 

CloseHandle

函数原型:

BOOL CloseHandle(HANDLEhObject);

读写都关闭后才能调用该函数

 

DisconnectNamedPipe

函数原型:

HANDLE WINAPI DisconnectNamedPipe(HANDLE hNamedPipe);

 

CloseHandle

函数原型:

BOOL CloseHandle(HANDLE hObject);

展开阅读全文

没有更多推荐了,返回首页