命名管道通信
1. 管道命名
\\<server>\pipe\<pipename>
<server>: ip地址, 或主机名称, 都可以. 如果只在一台主机上通信, 用'.' 代替. 多台主机中通信时, 服务端也使用 '.', 即 \\.\pipe\<pipename>
<pipename>: 自定义通信名称
2. 开启 IPC 连接
未开启时, 在客户端连接另一台主机的服务端时, 提示: CreateFile 会报错 :1326, '用户名或密码不正确。'
net use \\<ip>\ipc$ "<passwd>" /user:"<username>"
<ip>: ip地址
<username>: 用户名
<passwd>: 用户密码
3. 查看当前主机中的管道信息
在Chrome(Edge)地址栏中输入 file:\\.\pipe
4. Qt QLocalServer/QLocalSocket 在windows平台中即使用的命名管道(在linux中使用的本地套接字)
5. python 安装 pywin32 后, 可通过 win32pip 创建管道. 读写管道时, 使用 win32file.
pip install pywin32
服务端示例
import win32pipe import win32file BUFFER_SIZE = 65536 pipeName = r'\\.\pipe\pipename' def main(): hPipe = win32pipe.CreateNamedPipe(pipeName, win32pipe.PIPE_ACCESS_DUPLEX, win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT, win32pipe.PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, 0, None) win32pipe.ConnectNamedPipe(hPipe, None) data = win32file.ReadFile(hPipe, 100) print('server got data:', data) win32pipe.DisconnectNamedPipe(hPipe) if "__main__" == __name__: main()
客户端示例
import win32file pipeName = r'\\.\pipe\pipename' def main(): hPipe = win32file.CreateFile(pipeName, win32file.GENERIC_WRITE | win32file.GENERIC_READ, 0, None, win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None) win32file.WriteFile(hPipe, b'Hello world.' * 10) win32file.CloseHandle(hPipe) if '__main__' == __name__: main()
代码养活自己