• win32


    PeekNamedPipe: 将数据从命名管道或匿名管道复制到缓冲区中,而不将其从管道中删除。它还返回有关管道中数据的信息。

    示例:

    #include <iostream>
    #include <windows.h>
    #include <vector>
    using namespace std;
    
    int main(int argc, const char** argv)
    {
        wcout << "Creating an instance of a named pipe..." << endl;
    
        // Create a pipe to send data
        HANDLE pS = CreateNamedPipe(L"\\.\pipe\my_pipe", PIPE_ACCESS_DUPLEX, 0, 1, 100, 100, 0, NULL);
    
        // Open the named pipe
        HANDLE pC = CreateFile(L"\\.\pipe\my_pipe", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
        if (pC == INVALID_HANDLE_VALUE)
        {
            wcout << "Failed to connect to pipe." << endl;
            return 1;
        }
    
        wcout << "Test PeekNamedPipe #1." << endl;
        DWORD PipeByteNum = 0;
        BOOL res = PeekNamedPipe(pC, NULL, 0, NULL, &PipeByteNum, NULL);
        if (!res)
        {
            wcout << "PeekNamedPipe() - failed." << endl;
            return 1;
        }
        wcout << " - Number of bytes in pipe: " << PipeByteNum << endl << endl;
    
        wcout << "Sending data to pipe..." << endl;
    
        const wchar_t* data = L"Hello Pipe World";
        DWORD numBytesWritten = 0;
        BOOL result = WriteFile(pS, data, wcslen(data) * sizeof(wchar_t), &numBytesWritten, NULL);
    
        if (result)
            wcout << "Number of bytes sent: " << numBytesWritten << endl;
        else
        {
            wcout << "Failed to send data." << endl;
            return 1;
        }
    
        wcout << "Test PeekNamedPipe #2." << endl;
        PipeByteNum = 0;
        res = PeekNamedPipe(pC, NULL, 0, NULL, &PipeByteNum, NULL);
        if (!res)
        {
            wcout << "PeekNamedPipe() - failed." << endl;
            return 1;
        }
        wcout << " - Number of bytes in pipe: " << PipeByteNum << endl << endl;
    
        wcout << "Reading data from pipe..." << endl;
    
        // The read operation will block until there is data to read
        wchar_t buffer[128];
        DWORD numBytesRead = 0;
        result = ReadFile(pC, buffer, 5 * sizeof(wchar_t), &numBytesRead, NULL);
    
        if (result)
        {
            buffer[numBytesRead / sizeof(wchar_t)] = ''; // null terminate the string
            wcout << "Number of bytes read: " << numBytesRead << endl;
            wcout << "Message: " << buffer << endl;
        }
        else
        {
            wcout << "Failed to read data from the pipe." << endl;
            return 1;
        }
    
        wcout << "Test PeekNamedPipe #3." << endl;
        PipeByteNum = 0;
        DWORD bytesAvail = 0;
        BOOL isOK = PeekNamedPipe(pC, NULL, 0, NULL, &bytesAvail, NULL);
        // Allocate buffer and peek data from pipe
        DWORD bytesRead = 0;
        std::vector<wchar_t> buffer_(bytesAvail);
        isOK = PeekNamedPipe(pC, &buffer_[0], bytesAvail, &bytesRead, NULL, NULL);
        if (!isOK)
        {
            wcout << "PeekNamedPipe() - failed." << endl;
            return 1;
        }
        wcout << " - Number of bytes in pipe: " << bytesRead << endl << endl;
    
        // Close client.
        CloseHandle(pC);
        wcout << "Done with client." << endl;
    
        // Close the pipe.
        CloseHandle(pS);
        wcout << "Done with server." << endl;
    
        return 0;
    }

    ReadFile会先从管道内读取5*sizeof(wchar_t)大小的字节,然后PeekNamedPipe会读取剩下的字节。最后缓存区buffer_会打印“ Pipe World”

  • 相关阅读:
    LifeRay学习记录
    jQuery选择器
    JavaScript中for..in循环陷阱
    Python课程回顾(day18)
    Python课程回顾(day17)
    Python课程回顾(day15)
    Python课程回顾(day14)
    Python课程回顾(day13)
    Python课程回顾(day12)
    Python课程回顾(day11)
  • 原文地址:https://www.cnblogs.com/strive-sun/p/13720037.html
Copyright © 2020-2023  润新知