通过pipe进程间通信_第1页
通过pipe进程间通信_第2页
通过pipe进程间通信_第3页
通过pipe进程间通信_第4页
通过pipe进程间通信_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于 visual c 之 windows 核心编程代码分析 17 通过 pipe 进程间通信 分类 VC 编程技术 Visual C 2010 编程技术 Visual Studio2012 Windows8 信息安全 2011 12 17 12 17 120 人阅读 评论 0 收藏 举报 管道是一种用于在进程间共享数据的机制 其实质是一段共享内存 Windows 系统为这段 共享的内存设计采用数据流 I 0 的方式来访问 由一个进程读 另一个进程写 类似于一 个管道两端 因此这种进程间的通信方式称作 管道 管道分为匿名管道和命名管道 匿名管道只能在父子进程间进行通信 不能在网络间通信 而且数据传输是单向的 只 能一端写 另一端读 命令管道可以在任意进程间通信 通信是双向的 任意一端都可读可写 但是在同一时 间只能有一端读 一端写 管道客户端代码实现如下 view plaincopy to clipboardprint 1 头文件 2 include 3 include 4 include 5 include 6 常量 7 define BUFSIZE 512 8 9 int main VOID 10 功能 pipe 通信服务端主函数 11 12 int main int argc TCHAR argv 13 14 HANDLE hPipe 15 LPTSTR lpvMessage TEXT Default message from client 16 TCHAR chBuf BUFSIZE 17 BOOL fSuccess 18 DWORD cbRead cbWritten dwMode 19 LPTSTR lpszPipename TEXT pipe samplenamedpipe 20 21 if argc 1 如果输入了参数 则使用输入的参数 22 lpvMessage argv 1 23 while 1 24 25 打开一个命名 pipe 26 hPipe CreateFile 27 lpszPipename pipe 名 28 GENERIC READ GENERIC WRITE 可读可写 29 0 不共享 30 NULL 默认安全属性 31 OPEN EXISTING 已经存在 由服务端创建 32 0 默认属性 33 NULL 34 if hPipe INVALID HANDLE VALUE 35 break 36 37 如果不是 ERROR PIPE BUSY 错误 直接退出 38 if GetLastError ERROR PIPE BUSY 39 40 printf Could not open pipe 41 return 0 42 43 44 如果所有 pipe 实例都处于繁忙状态 等待 2 秒 45 if WaitNamedPipe lpszPipename 2000 46 47 printf Could not open pipe 48 return 0 49 50 51 52 pipe 已经连接 设置为消息读状态 53 dwMode PIPE READMODE MESSAGE 54 fSuccess SetNamedPipeHandleState 55 hPipe 句柄 56 不设置最长时间 59 if fSuccess 60 61 printf SetNamedPipeHandleState failed 62 return 0 63 64 65 写入 pipe 66 fSuccess WriteFile 67 hPipe 句柄 68 lpvMessage 写入的内容 69 lstrlen lpvMessage 1 sizeof TCHAR 写入内容的长度 70 非 overlapped 72 if fSuccess 73 74 printf WriteFile failed 75 return 0 76 77 78 do 79 80 读回复 81 fSuccess ReadFile 82 hPipe 句柄 83 chBuf 读取内容的缓存 84 BUFSIZE sizeof TCHAR 缓存大小 85 非 overlapped 87 88 if fSuccess 失败 退出 90 91 tprintf TEXT s n chBuf 打印读的结果 92 while fSuccess ERROR MORE DATA 或者成功则循环 93 94 getch 任意键退出 95 关闭句柄 96 CloseHandle hPipe 97 return 0 98 头文件 include include include include 常量 管道服务端代码实现如下 view plaincopy to clipboardprint 1 头文件 2 include 3 include 4 include 5 常量 6 define PIPE TIMEOUT 5000 7 define BUFSIZE 4096 8 结构定义 9 typedef struct 10 11 OVERLAPPED oOverlap 12 HANDLE hPipeInst 13 TCHAR chRequest BUFSIZE 14 DWORD cbRead 15 TCHAR chReply BUFSIZE 16 DWORD cbToWrite 17 PIPEINST LPPIPEINST 18 函数声明 19 VOID DisconnectAndClose LPPIPEINST 20 BOOL CreateAndConnectInstance LPOVERLAPPED 21 BOOL ConnectToNewClient HANDLE LPOVERLAPPED 22 VOID GetAnswerToRequest LPPIPEINST 23 VOID WINAPI CompletedWriteRoutine DWORD DWORD LPOVERLAPPED 24 VOID WINAPI CompletedReadRoutine DWORD DWORD LPOVERLAPPED 25 全局变量 26 HANDLE hPipe 27 28 int main VOID 29 功能 pipe 通信服务端主函数 30 31 int main VOID 32 33 HANDLE hConnectEvent 34 OVERLAPPED oConnect 35 LPPIPEINST lpPipeInst 36 DWORD dwWait cbRet 37 BOOL fSuccess fPendingIO 38 39 用于连接操作的事件对象 40 hConnectEvent CreateEvent 41 NULL 默认属性 42 TRUE 手工 reset 43 TRUE 初始状态 signaled 44 NULL 未命名 45 46 if hConnectEvent NULL 47 48 printf CreateEvent failed with d n GetLastError 49 return 0 50 51 OVERLAPPED 事件 52 oConnect hEvent hConnectEvent 53 54 创建连接实例 等待连接 55 fPendingIO CreateAndConnectInstance 56 57 while 1 58 59 等待客户端连接或读写操作完成 60 dwWait WaitForSingleObjectEx 61 hConnectEvent 等待的事件 62 INFINITE 无限等待 63 TRUE 64 65 switch dwWait 66 67 case 0 68 pending 69 if fPendingIO 70 71 获取 Overlapped I O 的结果 72 fSuccess GetOverlappedResult 73 hPipe pipe 句柄 74 不等待 77 if fSuccess 78 79 printf ConnectNamedPipe d n GetLastError 80 return 0 81 82 83 84 分配内存 85 lpPipeInst LPPIPEINST HeapAlloc GetProcessHeap 0 siz eof PIPEINST 86 if lpPipeInst NULL 87 88 printf GlobalAlloc failed d n GetLastError 89 return 0 90 91 lpPipeInst hPipeInst hPipe 92 93 读和写 注意 CompletedWriteRoutine 和 CompletedReadRoutine 的相互调用 94 lpPipeInst cbToWrite 0 95 CompletedWriteRoutine 0 0 LPOVERLAPPED lpPipeInst 96 97 再创建一个连接实例 以响应下一个客户端的连接 98 fPendingIO CreateAndConnectInstance 99 100 break 101 102 读写完成 103 case WAIT IO COMPLETION 104 break 105 106 default 107 108 printf WaitForSingleObjectEx d n GetLastErro r 109 return 0 110 111 112 113 return 0 114 115 116 117 CompletedWriteRoutine 118 写入 pipe 操作的完成函数 119 接口参见 FileIOCompletionRoutine 回调函数定义 120 121 当写操作完成时被调用 开始读另外一个客户端的请求 122 123 VOID WINAPI CompletedWriteRoutine 124 DWORD dwErr 125 DWORD cbWritten 126 LPOVERLAPPED lpOverLap 127 128 LPPIPEINST lpPipeInst 129 BOOL fRead FALSE 130 保存 overlap 实例 131 lpPipeInst LPPIPEINST lpOverLap 132 133 如果没有错误 134 if dwErr 0 143 144 if fRead 145 出错 断开连接 146 DisconnectAndClose lpPipeInst 147 148 149 150 CompletedReadRoutine 151 读取 pipe 操作的完成函数 152 接口参见 FileIOCompletionRoutine 回调函数定义 153 154 当读操作完成时被调用 写入回复 155 156 VOID WINAPI CompletedReadRoutine 157 DWORD dwErr 158 DWORD cbBytesRead 159 LPOVERLAPPED lpOverLap 160 161 LPPIPEINST lpPipeInst 162 BOOL fWrite FALSE 163 164 保存 overlap 实例 165 lpPipeInst LPPIPEINST lpOverLap 166 167 如果没有错误 168 if dwErr 0 172 将回复写入到 pipe 173 fWrite WriteFileEx 174 lpPipeInst hPipeInst 175 lpPipeInst chReply 将响应写入 pipe 176 lpPipeInst cbToWrite 177 LPOVERLAPPED lpPipeInst 178 写入完成后 调用 CompletedWriteRoutine 179 LPOVERLAPPED COMPLETION ROUTINE CompletedWriteRoutin e 180 181 182 if fWrite 183 出错 断开连接 184 DisconnectAndClose lpPipeInst 185 186 187 188 VOID DisconnectAndClose LPPIPEINST lpPipeInst 189 功能 断开一个连接的实例 190 参数 lpPipeInst 断开并关闭的实例句柄 191 192 VOID DisconnectAndClose LPPIPEINST lpPipeInst 193 194 关闭连接实例 195 if DisconnectNamedPipe lpPipeInst hPipeInst 196 197 printf DisconnectNamedPipe failed with d n GetLastErr or 198 199 关闭 pipe 实例的句柄 200 CloseHandle lpPipeInst hPipeInst 201 释放 202 if lpPipeInst NULL 203 HeapFree GetProcessHeap 0 lpPipeInst 204 205 206 207 BOOL CreateAndConnectInstance LPOVERLAPPED lpoOverlap 208 功能 建立连接实例 209 参数 lpoOverlap 用于 overlapped IO 的结构 210 返回值 是否成功 211 212 BOOL CreateAndConnectInstance LPOVERLAPPED lpoOverlap 213 214 LPTSTR lpszPipename TEXT pipe samplenamedpipe 215 创建 named pipe 216 hPipe CreateNamedPipe 217 lpszPipename pipe 名 218 PIPE ACCESS DUPLEX 可读可写 219 FILE FLAG OVERLAPPED overlapped 模式 220 pipe 模式 221 PIPE TYPE MESSAGE 消息类型 pipe 222 PIPE READMODE MESSAGE 消息读模式 223 PIPE WAIT 阻塞模式 224 PIPE UNLIMITED INSTANCES 无限制实例 225 BUFSIZE sizeof TCHAR 输出缓存大小 226 BUFSIZE sizeof TCHAR 输入缓存大小 227 PIPE TIMEOUT 客户端超时 228 NULL 默认安全属性 229 if hPipe INVALID HANDLE VALUE 230 231 printf CreateNamedPipe failed with d n GetLastError 232 return 0 233 234 235 连接到新的客户端 236 return ConnectToNewClient hPipe lpoOverlap 237 238 239 240 BOOL ConnectToNewClient HANDLE hPipe LPOVERLAPPED lpo 241 功能 建立连接实例 242 参数 lpoOverlap 用于 overlapped IO 的结构 243 返回值 是否成功 244 245 BOOL ConnectToNewClient HANDLE hPipe LPOVERLAPPED lpo 246 247 BOOL fConnected fPendingIO FALSE 248 249 开始一个 overlapped 连接 250 fConnected ConnectNamedPipe hPip

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论