美文网首页windows进程通信
Windows进程间通信之管道

Windows进程间通信之管道

作者: Virtualer | 来源:发表于2019-08-27 17:08 被阅读0次

命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。

  • 优点是实现起来比较简单方便.
  • 缺点是会使进程之间的代码耦合度增加.并且管道通信只适用于同一台主机上的进程之间通讯.

代码如下:

  • 服务端
#include <stdio.h>
#include <windows.h>
#include <ctime>
#include <tchar.h>

int main(int argc, _TCHAR *argv[]) {
    srand(time(NULL));
    char buf[256] = "";
    DWORD rlen = 0;
    HANDLE hPipe = CreateNamedPipe(
            TEXT("\\\\.\\Pipe\\mypipe"),                            //管道名
            PIPE_ACCESS_DUPLEX,                                     //管道类型
            PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,  //管道参数
            PIPE_UNLIMITED_INSTANCES,                               //管道能创建的最大实例数量
            0,                                                      //输出缓冲区长度 0表示默认
            0,                                                      //输入缓冲区长度 0表示默认
            NMPWAIT_WAIT_FOREVER,                                   //超时时间
            NULL);                                                  //指定一个SECURITY_ATTRIBUTES结构,或者传递零值.
    if (INVALID_HANDLE_VALUE == hPipe) {
        printf("Create Pipe Error(%d)\n", GetLastError());
    } else {
        printf("Waiting For Client Connection...\n");
        if (ConnectNamedPipe(hPipe, NULL) == NULL) //阻塞等待客户端连接。
        {
            printf("Connection failed!\n");
        } else {
            printf("Connection Success!\n");
        }
        while (true) {
            if (ReadFile(hPipe, buf, 256, &rlen, NULL) == FALSE) //接受客户端发送过来的内容
            {
                printf("Read Data From Pipe Failed!\n");
                break;
            } else {
                printf("From Client: data = %s, size = %d\n", buf, rlen);
                char wbuf[256] = "";
                sprintf(wbuf, "%s%d", wbuf, rand() % 1000);
                DWORD wlen = 0;
                WriteFile(hPipe, wbuf, sizeof(wbuf), &wlen, 0); //向客户端发送内容
                printf("To Client: data = %s, size = %d\n", wbuf, wlen);
                Sleep(1000);
            }
        }
        CloseHandle(hPipe);//关闭管道
    }
    system("PAUSE");
    return 0;
}
  • 客户端
#include <stdio.h>
#include <windows.h>
#include <ctime>
#include <tchar.h>

int main(int argc, _TCHAR *argv[]) {
    srand(time(NULL));
    DWORD wlen = 0;
    Sleep(1000);//等待pipe的创建成功!
    BOOL bRet = WaitNamedPipe(TEXT("\\\\.\\Pipe\\mypipe"), NMPWAIT_WAIT_FOREVER);
    if (!bRet) {
        printf("connect the namedPipe failed!\n");
        return 0;
    }

    HANDLE hPipe = CreateFile(              //管道属于一种特殊的文件
            TEXT("\\\\.\\Pipe\\mypipe"),    //创建的文件名
            GENERIC_READ | GENERIC_WRITE,   //文件模式
            0,                              //是否共享
            NULL,                           //指向一个SECURITY_ATTRIBUTES结构的指针
            OPEN_EXISTING,                  //创建参数
            FILE_ATTRIBUTE_NORMAL,          //文件属性(隐藏,只读)NORMAL为默认属性
            NULL);                          //模板创建文件的句柄  

    if (INVALID_HANDLE_VALUE == hPipe) {
        printf("open the exit pipe failed!\n");
    } else {
        while (true) {
            char buf[256] = "";
            sprintf(buf, "%s%d", buf, rand() % 1000);
            if (WriteFile(hPipe, buf, sizeof(buf), &wlen, 0) == FALSE) //向服务器发送内容
            {
                printf("write to pipe failed!\n");
                break;
            } else {
                printf("To Server: data = %s, size = %d\n", buf, wlen);
                char rbuf[256] = "";
                DWORD rlen = 0;
                ReadFile(hPipe, rbuf, sizeof(rbuf), &rlen, 0);  //接受服务发送过来的内容
                printf("From Server: data = %s, size = %d\n", rbuf, rlen);
            }
            Sleep(1000);
        }
        CloseHandle(hPipe);//关闭管道
    }
    system("PAUSE");
    return 0;
}

相关文章

  • Windows进程间通信之管道

    命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管...

  • Linux 进程间通信

    进程间通信 一 进程间通信 -- 管道 mkfifo test 创建管道文件 匿名管道和命名管道:匿名管道:匿名管...

  • Android Binder

    Binder整理 1、IPC: 进程间通讯或者夸进程通信windows ipc方式:剪贴板、管道、邮槽等等linu...

  • 零散的小知识记录(待补充和修改)

    Android跨进程通信:Binder,socket/管道/消息队列,共享内存; linux进程间通信:管道,Bi...

  • 20.2、python进程间通信——队列和管道

    进程间通信——队列和管道(multiprocess.Queue、multiprocess.Pipe) 进程间通信 ...

  • Linux进程间通信

    Linux进程间通信的概念 linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named p...

  • Linux系统编程:Inter-Process Communic

    一、IPC——进程间通信 Linux系统提供的进程间通信的手段: 消息传递类:信号 匿名管道 命名管道 socke...

  • unix进程间的通信方式

    参考来源:unix进程间的通信方式 (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一...

  • windows 匿名管道

    1、匿名管道是进程间通信的一种技术。windows提供的匿名管道技术,不能够跨网络跨机器,只能在同一机器上不同进程...

  • 系统与网络编程(进程间通信)

    进程间通信 ipc:interprocess communication 通信方式 管道通信Paste_Image...

网友评论

    本文标题:Windows进程间通信之管道

    本文链接:https://www.haomeiwen.com/subject/hzaeectx.html