zoukankan      html  css  js  c++  java
  • 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”

  • 相关阅读:
    什么是工厂模式
    冒泡算法
    CSS中的绝对定位与相对定位
    JS function立即调用的几种写法
    paip.java 线程无限wait的解决
    paip.java 多线程参数以及返回值Future FutureTask 的使用.
    PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束
    paip.slap工具与于64位win7与JDBC的性能对比
    JProfiler8 注册码序列号
    paip.提升性能---mysql 优化cpu多核以及lan性能的关系.
  • 原文地址:https://www.cnblogs.com/strive-sun/p/13720037.html
Copyright © 2011-2022 走看看