我是靠谱客的博主 魔幻海燕,最近开发中收集的这篇文章主要介绍命名管道,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

      命名管道作为一种进程通信机制,被广泛应用于编程中。今天我将自己理解的内容记录一下。

      使用命名管道,就必须首先创建命名管道,创建命名管道的函数原型如下:

HANDLE WINAPI CreateNamedPipe(
  __in      LPCTSTR lpName,
  __in      DWORD dwOpenMode,
  __in      DWORD dwPipeMode,
  __in      DWORD nMaxInstances,
  __in      DWORD nOutBufferSize,
  __in      DWORD nInBufferSize,
  __in      DWORD nDefaultTimeOut,
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes
);


参数nMaxInstances此命名对象可以有多少个实例。对于命名管道,可以同时创建多个实例,只要不超过nMaxInstances。一个实例只能连接一个客户端,若想连接其它的客户端,需要先调用DisconnectNamedPipe关闭现有的管道连接。另外创建命名对象时可以为参数dwOpenMode指定FILE_FLAG_FIRST_PIPE_INSTANCE,指定这个参数后,若创建的命名管道对象不是第一个实例,会报错ERROR_ACCESS_DENIED。

服务器端需要调用ConnectNamedPipe接受客户端连接。若调用此函数之前,客户端已经调用CreateFile连接到了此实例,ConnectNamedPipe返回FALSE,并且GetLastError()返回ERROR_PIPE_CONNECTED。这是一个正常的连接,虽然函数返回了FALSE。

客户端端调用CreateFile连接命名对象。调用ReadFile及WriteFile发送数据。

客户端可以调用WaitNamedPipe等待命名对象实例做好准备连接客户端,SDK上说

Waits until either a time-out interval elapses or an instance of the specified named pipe is available for connection (that is, the pipe's server process has a pendingConnectNamedPipe operation on the pipe).

根据测试结果,调用CreateNamedPipe完毕后,应该已经有了一个挂起的ConnectNamedPipe 操作。服务器调用完DisconnectNamedPipe后,若客户端调用WaitNamedPipe,则此时客户端挂起等待。服务器显式调用ConnectNamedPipe后,客户端调用WaitNamedPipe结束,此时连接命名对象应该成功。

 其实我测试命名管道的目的是观察通过服务端调用ImpersonateNamedPipeClient后线程安全上下文的变化情况,sdk说的清楚,

When this function is called, the named-pipe file system changes the thread of the calling process to start impersonating the security context of the last message read from the pipe. Only the server end of the pipe can call this function.

所以说服务端接受客户端连接后,还必须接收到客户端的消息才能模拟客户端安全上下文,否则模拟失败。

调用OpenThreadToken需要注意,若此线程没有关联过令牌(设置或者扮演),此函数返回ERROR_NO_TOKEN(1008)。

 

最后

以上就是魔幻海燕为你收集整理的命名管道的全部内容,希望文章能够帮你解决命名管道所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部