命名管道

什么是命名管道

​ 命名管道在管道服务器和一个或多个管道客户端之间提供进程间通信。 它们比匿名管道(用于在本地计算机上提供进程间的通信)提供更多的功能。 命名管道支持跨网络和多个服务器实例的全双工通信、基于消息的通信以及客户端模拟,这样连接进程便可在远程服务器上使用自己的权限集。每一个命名管道都有一个唯一的名字以识别存在于系统的命名对象列表中的命名管道

命名管道模板:

//服务端
BOOL NamedPipeServer()
{

    char  PipeName[] = { "\\\\.\\pipe\\PipeName" };
    //服务端创建管道
    HANDLE hNamePipe = CreateNamedPipeA(PipeName,
                                        PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 
                                        PIPE_TYPE_BYTE, 1, 1024, 1024, 0, NULL);
    if (hNamePipe == INVALID_HANDLE_VALUE)
    {
        printf("create NamedPipe failed\n error code : %d\n", GetLastError());
        return FALSE;
    }

    //等待客户端进行连接
    BOOL b = ConnectNamedPipe(hNamePipe, NULL);


    //利用管道进行通信读写
    char buf[1024];
    DWORD cbWrite;
    ZeroMemory(buf, 1024);
    //读取管道中的内容
    ReadFile(hNamePipe, buf, 1024, &cbWrite, NULL);

    //关闭管道
    DisconnectNamedPipe(hNamePipe);
    CloseHandle(hNamePipe);

    return TRUE;
}
//客户端
BOOL NamedPipeClient(char* pMsg)
{
    //检查管道是否打开
    char  PipeName[] = { "\\\\.\\pipe\\PipeName" };
    BOOL b = WaitNamedPipeA(PipeName, 0);   

    //打开管道
    HANDLE hFile = CreateFileA(PipeName, 
                                GENERIC_READ | GENERIC_WRITE,
                                0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if ( !b || (hFile == INVALID_HANDLE_VALUE) )
    {
        printf("connected faild\n");
        return FALSE;
    }

    //进行通信
    char buf[1024];
    ZeroMemory(buf, 1024);
    DWORD dwRead;
    WriteFile(hFile, pMsg, strlen(pMsg), &dwRead, NULL);
    CloseHandle(hFile);

    return TRUE;
}

参考自此处