Windows命名管道
发布时间:2023-02-03 15:16:15 293
相关标签: # c++# 服务器# 数据# 服务器# 信息
命名管道是一种常用的进程间通信手段,它可以单向也可以双工,用于管道服务器与一个或多个管道客户端之间的通信。Windows命名管道提供了两种基本通信模式,字节模式和消息模式。使用中,二者并无本职区别,更多还是由程序员自己选择和控制。在字节模式中,数据以一个连续的字节流的形式在客户机和服务器之间流动。而在消息模式中,客户机和服务器则通过一系列不连续的数据单位进行数据的收发,每次在管道上发出一条消息后,它必须作为一条完整的消息读取。
服务端创建管道流程
- 创建命名管道:CreateNamedPipe
- 等待客户端连接:ConnectNamedPipe (会阻塞,等待连接)
- 读取数据:ReadFile、ReadFileEx
- 写入数据:WriteFile、WriteFileEx
- 关闭连接:DisconnectNamedPipe
- 关闭管道:CloseHandle
客户端连接管道流程
- 打开命名管道:CreateFile
- 等待服务端响应:WaitNamedPipe(可选)
- 切换管道为读模式:SetNamedPipeHandleState(这个API很重要,要和服务端模式匹配,否则会出现数据发送和接收问题)
- 写入数据:WriteFile、WriteFileEx
- 读取数据:ReadFile、ReadFileEx
- 关闭管道:CloseHandle
需要注意的一点是,数据粘连,如果连续发送数据,可能多条消息被另一端同时读取,需要对读取到的数据做细致处理。
核心API
HANDLE CreateNamedPipe(
[in] LPCSTR lpName, //管道名称
[in] DWORD dwOpenMode, //打开模式:PIPE_ACCESS_INBOUND(服务器只读,客户端仅写入)、PIPE_ACCESS_OUTBOUND(服务器写入,管道客户端为只读)、PIPE_ACCESS_DUPLEX(服务端客户端都可读/写)
[in] DWORD dwPipeMode, //管道模式:字节模式、消息模式,各有相关的定义
[in] DWORD nMaxInstances, //管道能够创建的最大实例数量
[in] DWORD nOutBufferSize, //输出缓冲区大小
[in] DWORD nInBufferSize, //输入缓冲区大小
[in] DWORD nDefaultTimeOut, //超市时间
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes //管道属性
);
BOOL ConnectNamedPipe(
[in] HANDLE hNamedPipe, //管道句柄
[in, out, optional] LPOVERLAPPED lpOverlapped //如设为NULL,表示将线程挂起,直到一个客户同管道连接为止。否则就立即返回。
);
BOOL SetNamedPipeHandleState(
[in] HANDLE hNamedPipe, //管道句柄
[in, optional] LPDWORD lpMode, //修改模式,对应:字节模式、消息模式,各有相关的定义
[in, optional] LPDWORD lpMaxCollectionCount, //网络命名管道使用,在传输到服务器之前,客户端计算机上收集的最大字节数,如果客户端和服务器进程位于同一台计算机上,则此参数必须为 NULL
[in, optional] LPDWORD lpCollectDataTimeout //网络命名管道使用,可以在远程命名管道通过网络传输信息之前传递的最大时间
);
文章来源: https://blog.51cto.com/u_14207158/5780984
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报