命名管道是一种常用的进程间通信手段,它可以单向也可以双工,用于管道服务器与一个或多个管道客户端之间的通信。Windows命名管道提供了两种基本通信模式,字节模式和消息模式。使用中,二者并无本职区别,更多还是由程序员自己选择和控制。在字节模式中,数据以一个连续的字节流的形式在客户机和服务器之间流动。而在消息模式中,客户机和服务器则通过一系列不连续的数据单位进行数据的收发,每次在管道上发出一条消息后,它必须作为一条完整的消息读取。
服务端创建管道流程
- 创建命名管道:CreateNamedPipe
- 等待客户端连接:ConnectNamedPipe (会阻塞,等待连接)
- 读取数据:ReadFile、ReadFileEx
- 写入数据:WriteFile、WriteFileEx
- 关闭连接:DisconnectNamedPipe
- 关闭管道:CloseHandle
客户端连接管道流程
- 打开命名管道:CreateFile
- 等待服务端响应:WaitNamedPipe(可选)
- 切换管道为读模式:SetNamedPipeHandleState(这个API很重要,要和服务端模式匹配,否则会出现数据发送和接收问题)
- 写入数据:WriteFile、WriteFileEx
- 读取数据:ReadFile、ReadFileEx
- 关闭管道:CloseHandle
需要注意的一点是,数据粘连,如果连续发送数据,可能多条消息被另一端同时读取,需要对读取到的数据做细致处理。