Windows进程间通信—命名管道

命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。与Socket网络通信相比,命名管道不再需要编写身份验证的代码。将

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。与Socket网络通信相比,命名管道不再需要编写身份验证的代码。将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据。命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。命名管道服务器只能在WindowsNT或Windows2000上创建,不过可以是客户机。命名管道提供了两种基本通信模式,字节模式和消息模式。在字节模式中,数据以一个连续的字节流的形式在客户机和服务器之间流动。而在消息模式中,客户机和服务器则通过一系列不连续的数据单位进行数据的收发,每次在管道上发出一条消息后,它必须作为一条完整的消息读入。

服务端代码流程:

1、创建命名管道:CreateNamedPipe

2、等待客户端连接:ConnectNamedPipe

3、读取客户端请求数据:ReadFile

4、向客户端回复数据:WriteFile

5、关闭连接:DisconnectNamedPipe

6、关闭管道:CloseHandle

#include "stdafx.h"  
#include <windows.h>  
#include <strsafe.h>  
  
#define BUFSIZE 4096  
  
DWORD WINAPI InstanceThread(LPVOID);   
VOID GetAnswerToRequest(LPTSTR, LPTSTR, LPDWORD);   
  
int _tmain(VOID)   
{   
    BOOL fConnected;   
    DWORD dwThreadId;   
    HANDLE hPipe, hThread;   
    LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe");   
  
    // The main loop creates an instance of the named pipe and   
    // then waits for a client to connect to it. When the client   
    // connects, a thread is created to handle communications   
    // with that client, and the loop is repeated.   
  
    for (;;)   
    {   
        hPipe = CreateNamedPipe(   
            lpszPipename,             // pipe name   
            PIPE_ACCESS_DUPLEX,       // read/write access   
            PIPE_TYPE_MESSAGE |       // message type pipe   
            PIPE_READMODE_MESSAGE |   // message-read mode   
            PIPE_WAIT,                // blocking mode   
            PIPE_UNLIMITED_INSTANCES, // max. instances    
            BUFSIZE,                  // output buffer size   
            BUFSIZE,                  // input buffer size   
            0,                        // client time-out   
            NULL);                    // default security attribute   
  
        if (hPipe == INVALID_HANDLE_VALUE)   
        {  
            printf("CreatePipe failed");   
            return 0;  
        }  
  
        // Wait for the client to connect; if it succeeds,   
        // the function returns a nonzero value. If the function  
        // returns zero, GetLastError returns ERROR_PIPE_CONNECTED.   
  
        fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);   
  
        if (fConnected)   
        {   
            // Create a thread for this client.   
            hThread = CreateThread(   
                NULL,              // no security attribute   
                0,                 // default stack size   
                InstanceThread,    // thread proc  
                (LPVOID) hPipe,    // thread parameter   
                0,                 // not suspended   
                &dwThreadId);      // returns thread ID   
  
            if (hThread == NULL)   
            {  
                printf("CreateThread failed");   
                return 0;  
            }  
            else CloseHandle(hThread);   
        }   
        else  
        {  
            // The client could not connect, so close the pipe.   
            CloseHandle(hPipe);   
        }  
    }   
    return 1;   
}   
  
DWORD WINAPI InstanceThread(LPVOID lpvParam)   
{   
    TCHAR chRequest[BUFSIZE];   
    TCHAR chReply[BUFSIZE];   
    DWORD cbBytesRead, cbReplyBytes, cbWritten;   
    BOOL fSuccess;   
    HANDLE hPipe;   
  
    // The thread's parameter is a handle to a pipe instance.   
  
    hPipe = (HANDLE) lpvParam;   
  
    while (1)   
    {   
        // Read client requests from the pipe.   
        fSuccess = ReadFile(   
            hPipe,        // handle to pipe   
            chRequest,    // buffer to receive data   
            BUFSIZE*sizeof(TCHAR), // size of buffer   
            &cbBytesRead, // number of bytes read   
            NULL);        // not overlapped I/O   
  
        if (! fSuccess || cbBytesRead == 0)   
            break;   
        printf((const char*)chRequest);  
  
        GetAnswerToRequest(chRequest, chReply, &cbReplyBytes);   
  
        // Write the reply to the pipe.   
        fSuccess = WriteFile(   
            hPipe,        // handle to pipe   
            chReply,      // buffer to write from   
            cbReplyBytes, // number of bytes to write   
            &cbWritten,   // number of bytes written   
            NULL);        // not overlapped I/O   
  
        if (! fSuccess || cbReplyBytes != cbWritten) break;   
    }   
  
    // Flush the pipe to allow the client to read the pipe's contents   
    // before disconnecting. Then disconnect the pipe, and close the   
    // handle to this pipe instance.   
  
    FlushFileBuffers(hPipe);   
    DisconnectNamedPipe(hPipe);   
    CloseHandle(hPipe);   
  
    return 1;  
}  
  
VOID GetAnswerToRequest(LPTSTR chRequest,   
                        LPTSTR chReply, LPDWORD pchBytes)  
{  
    _tprintf( TEXT("%s\n"), chRequest );  
    StringCchCopy( chReply, BUFSIZE, TEXT("Default answer from server") );  
    *pchBytes = (lstrlen(chReply)+1)*sizeof(TCHAR);  
}  
/* 何问起 hovertree.com */

客户端代码流程:

1、打开命名管道:CreateFile

2、等待服务端响应:WaitNamedPipe

3、切换管道为读模式:SetNamedPipeHandleState

4、向服务端发数据:WriteFile

5、读服务端返回的数据:ReadFile

6、关闭管道:CloseHandle

#include "stdafx.h"  
#include <windows.h>  
#include <conio.h>  
  
  
#define BUFSIZE 512  
  
int _tmain(int argc, TCHAR *argv[])   
{   
    HANDLE hPipe;   
    LPTSTR lpvMessage=TEXT("Default message from client");   
    TCHAR chBuf[BUFSIZE];   
    BOOL fSuccess;   
    DWORD cbRead, cbWritten, dwMode;   
    LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe");   
  
    if( argc > 1 )  
        lpvMessage = argv[1];  
  
    // Try to open a named pipe; wait for it, if necessary.   
  
    while (1)   
    {   
        hPipe = CreateFile(   
            lpszPipename,   // pipe name   
            GENERIC_READ |  // read and write access   
            GENERIC_WRITE,   
            0,              // no sharing   
            NULL,           // default security attributes  
            OPEN_EXISTING,  // opens existing pipe   
            0,              // default attributes   
            NULL);          // no template file   
  
        // Break if the pipe handle is valid.   
  
        if (hPipe != INVALID_HANDLE_VALUE)   
            break;   
  
        // Exit if an error other than ERROR_PIPE_BUSY occurs.   
  
        if (GetLastError() != ERROR_PIPE_BUSY)   
        {  
            printf("Could not open pipe");   
            return 0;  
        }  
  
        // All pipe instances are busy, so wait for 20 seconds.   
  
        if (!WaitNamedPipe(lpszPipename, 20000))   
        {   
            printf("Could not open pipe");   
            return 0;  
        }   
    }   
  
    // The pipe connected; change to message-read mode.   
  
    dwMode = PIPE_READMODE_MESSAGE;   
    fSuccess = SetNamedPipeHandleState(   
        hPipe,    // pipe handle   
        &dwMode,  // new pipe mode   
        NULL,     // don't set maximum bytes   
        NULL);    // don't set maximum time   
    if (!fSuccess)   
    {  
        printf("SetNamedPipeHandleState failed");   
        return 0;  
    }  // 何问起 hovertree.com
  
    // Send a message to the pipe server.   
  
    fSuccess = WriteFile(   
        hPipe,                  // pipe handle   
        lpvMessage,             // message   
        (lstrlen(lpvMessage)+1)*sizeof(TCHAR), // message length   
        &cbWritten,             // bytes written   
        NULL);                  // not overlapped   
    if (!fSuccess)   
    {  
        printf("WriteFile failed");   
        return 0;  
    }  
  
    do   
    {   
        // Read from the pipe.   
  
        fSuccess = ReadFile(   
            hPipe,    // pipe handle   
            chBuf,    // buffer to receive reply   
            BUFSIZE*sizeof(TCHAR),  // size of buffer   
            &cbRead,  // number of bytes read   
            NULL);    // not overlapped   
  
        if (! fSuccess && GetLastError() != ERROR_MORE_DATA)   
            break;   
  
        _tprintf( TEXT("%s\n"), chBuf );   
    } while (!fSuccess);  // repeat loop if ERROR_MORE_DATA   
  
    getch();  
  
    CloseHandle(hPipe);   
  
    return 0;   
}  

推荐:http://www.cnblogs.com/roucheng/p/vs2015cpp.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120294.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vb api函数用法_VB调用apdl

    vb api函数用法_VB调用apdl1、API函数    API的英文全称(ApplicationProgrammingInterface),WIN32API也就是MicrosoftWindows32位平台的应用程序编程接口,在window操作系统盛行的期间,程序员主要是利用API函数来开发Windows平台下的应用程序当时程序员必须熟记很多API函数。随着软件技术的不断发展,在Windows平台上出现了很所可视化编程

    2025年6月13日
    2
  • java缓存数据并配置有效时间[通俗易懂]

    java缓存数据并配置有效时间[通俗易懂]没有用到redis只是单纯的使用内存存储数据实现的功能:缓存数据并配置有效时间,可设置默认时间自动清除缓存,也可以自己设置。直接上代码:importjava.util.LinkedList;importjava.util.List;importjava.util.Map.Entry;importjava.util.Timer;importjava.util.TimerTask;importjava.util.concurrent.ConcurrentHashMap;publ

    2022年10月4日
    2
  • [Cqoi2014]数三角形——组合数

    [Cqoi2014]数三角形——组合数[Cqoi2014]数三角形——组合数

    2022年4月20日
    43
  • phpstorm+AppServ配置和出现timezone setting错误

    phpstorm+AppServ配置和出现timezone setting错误setting —> php,选择php版本,并点击…,选择到php.exe进入到appserv底下找到php.ini文件,查找date.timezone,去掉前面的;号,添加”Asia/Shanghai”重启appserv环境,就是重启下apache 和 mysql服务发现依然失败后面重启电脑就可以了哈哈哈哈哈哈哈哈…

    2022年8月19日
    5
  • 哈希表是哪一章节_哈希表的构造方法

    哈希表是哪一章节_哈希表的构造方法哈希表是个啥?小白:庆哥,什么是哈希表?这个哈希好熟悉,记得好像有HashMap和HashTable之类的吧,这是一样的嘛?????庆哥:这个哈希确实经常见????,足以说明它是个使用非常频繁的玩意儿,而且像你说的HashMap和HashTable之类的与哈希这个词肯定是有关系的,那哈希是个啥玩意啊,这个咱们还是得先来搞明白啥是个哈希表。????我们看看百科解释吧:散列表(Hashtable,也叫哈…

    2022年8月10日
    6
  • 数据脱敏——什么是数据脱敏「建议收藏」

    数据脱敏——什么是数据脱敏「建议收藏」一、什么是数据脱敏?  数据脱敏(DataMasking),又称数据漂白、数据去隐私化或数据变形。    百度百科对数据脱敏的定义为:指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。

    2022年5月11日
    82

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号