【远程cmd通信技术】笔记

1.管道技术-Windows

管道是一种简单的进程间通讯的技术。

管道就是一部份共享内存以便进程可以用来相互通信,创建了Pipe内核对象的进程就是一个Pipe Server, 当另一个进程与这个进程创建的Pipe Server连接时,就称为Pipe Client.当一个进程往Piple当中写入信息时,另一个进程便可以从这个Pipe读出这个信息。

管道可以分为命名管道和匿名管道。匿名管道比命名管道要简单很多,他是一个未命名的单向管道,常用来在一个父进程和一个子进程之间传递数据,匿名管道只能实现本地机器上两个进程的通信,不能实现跨网络的通信。
匿名管道由CreatePipe()函数创建,他的定义如下

  BOOL CreatePipe(
     PHANDLE hReadPipe, // 指向读句柄的指针(指向HANDLE类型的指针,返回管道的读句柄)
   PHANDLE hWritePipe, // 指向写句柄的指针(指向HANDLE类型的指针,返回管道的写句柄)
   LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向SECURITY_ATTRIBUTES结构体的指针,检测返回的句柄是否能够被子进程继承。
   DWORD nSize // 指定管道的缓冲区大小,这里赋值为0,使用系统默认大小的缓冲区
  ); 

SECURITY_ATTRIBUTES结构体定义如下:

typedef struct _SECURITY_ATTRIBUTES 
    {
   DWORD nLength;//结构体大小,可用sizeof取得
   LPVOID lpSecurityDescriptor; //指向一个对象的安全描述符 该安全描述符控制对象的共享 如果为NULL 则该对象使用调用进程的默认安全描述符 
   BOOL bInheritHandle;//安全描述的对象能否被新创建的进程继承返回句柄 若为TRUE 则新进程继承该句柄
   } SECURITY_ATTRIBUTES,        *PSECURITY_ATTRIBUTES;

一个匿名管道有两头,他们分别是读句柄和写句柄。写句柄用来写入数据,读句柄用来读取数据。我们分别调用ReadFile()和WriteFile() 就可以了。

BOOL ReadFile(
  HANDLE hFile,
  LPVOID lpBuffer,
  DWORD nNumberOfBytesToRead,
  LPDWORD lpNumberOfBytesRead, 
  LPOVERLAPPED lpOverlapped
  );
BOOL WriteFile(
      HANDLE hFile,
      LPCVOID lpBuffer,
      DOWRD nNumberOfBytesToWrite,
      LPOVERLAPPED lpOverlapped 
);

在读取管道数据前,需要判断管道是够有数据存在。负责这个工作的函数是PeekNamedPipe(),其定义如下:

BOOL WINAPI PeekNamedPipe(
      HANDLE hNamedPipe, //管道句柄
      LPVOID lpBuffer, //读取输出缓冲区,可选,没有数据是null
      DWORD nBufferSize, //缓冲区大小,如果上面那个是null,那就忽略这个
      LPDWORD lpBytesRead, //接收从管道中读取数据的变量的指针,可选,此参数可以为NULL,如果没有数据要读取。
      LPDWORD lpTotalBytesAvail, //接收从管道读取的字节总数,此参数可以为NULL,如果没有数据要读取。
      LPDWORD lpBytesLeftThisMessage //返回该消息中剩余的字节数,对于匿名管道可以为0
);

猜你喜欢

转载自www.cnblogs.com/ZARX/p/13377958.html