命名管道通信

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()

  

 

posted @ 2024-10-31 20:52  阿Hai  阅读(5)  评论(0编辑  收藏  举报