C/C++ 进程通讯(命名管道)

服务端代码:

// pipe_server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <ctime>

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))    //阻塞等待客户端连接。
         {
             printf("Connection failed!\n");
         }
         else
         {
             printf("Connection Success!\n");
         }

        while (true)
         {
             if(!ReadFile(hPipe,buf,256,&rlen,NULL)) //接受客户端发送过来的内容
             {
                 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);
             }
         }
         FlushFileBuffers(hPipe);
         DisconnectNamedPipe(hPipe);
         CloseHandle(hPipe);//关闭管道
     }

    system("pause");
     return 0;
}

客户端代码:

// pipe_client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <ctime>

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;
}

  

时间: 2024-08-10 02:10:52

C/C++ 进程通讯(命名管道)的相关文章

Linux学习笔记(13)-进程通信|命名管道

匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名管道,那便是拥有名字的管道,同时也被称之为FIFO,谈到FIFO,那么做过单片机开发的同学想必是不陌生的. 在很多单片机的项目中,都使用过FIFO,FIFO其实是一种队列,先进先出,这样可以保证读出数据和写入数据的一致性. 使用FIFO文件,便可以在不同的,且不具有亲属关系的进程中进程通信. 创建命

C# 进程通信-命名管道

之前看wcf服务的时候看到wcf有支持管道通信协议,之前不知道,最近刚好有用到这个,这里写个简单实例 .net有已经封装好的pip通信的对象NamedPipeServerStream 和NamedPipeClientStream对象,底层应该还是调用C++实现的api实现的 对服务端和客户端做个简单的封装方便调用: server: public class PipServer:Log { public Action<string> ReceiveEvent; NamedPipeServerSt

进程通信——命名管道通信

private static void WaitData() { using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut, 1)) { try { pipeServer.WaitForConnection(); pipeServer.ReadMode = PipeTransmissionMode.Byte; using (StreamReade

Linux系统编程——进程间通信:命名管道(FIFO)

命名管道的概述 无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看<无名管道>).为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道.FIFO 文件. 命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据. 命名管道(FIFO)和无名管道(pipe)有一

进程间通讯之 命名管道

命名管道其实用的还是API函数,我估计是底层应该是操作系统 分配了一块单独的内存空间,两个程序或是多个程序都可以对这块内存进行读写. 这些所谓的管道API函数,就是我们编程人员操作这些内存空间的方法. ××××××××××××××××××××××××××××××××××××× 用到的API函数 管道服务器首次调用CreateNamedPipe()函数时,使用nMaxInstance参数指定了能同时存在的管道实例的最大数目.服务器可以重复调用CreateNamedPipe()函数去创建管道新的实例

邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#

邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系统所需要编写的代码非常少.如果读者是项目经理,就可以给你手下每一位员工的机器上安装上这个系统中的邮槽服务器端程序,在你自己的机器上安装油槽的客户端程序,这样,当你想通知员工开会,就可以通过自己安装的邮槽客户端程序.将开会这个消息发送出去,因为机器上都安装了邮槽服务器端的程序,所以他们都能同时收到你发

命名管道跨进程通信实例1(转)

原文地址:http://www.cnblogs.com/yukaizhao/archive/2011/08/08/namedpipeserverstream-example.html 本文介绍命名管道使用实例,文中例子是几个客户端都通过一台服务器获得新生成的int类型id. 服务器端功能:当客户端请求一个新的id时,将现有id自增1,然后返回给客户端. 服务器端实现:在程序启动时,启动n个线程,在每个线程中都声明一个NamedPipeServerStream的实例,并循环的WaitForConn

linux_c开发(5-2)进程间通讯_管道通讯

管道通信 什么是管道? 管道是单向的.先进先出的,他把一个进程的输出和另一个进程的输入连接在一起.一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据. 管道创建 管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通讯,后者可用于同一系统中的任意两个进程间的通讯. 无名管道由pipe()函数创建: int pipe(int filedis[2]); 当一个管道建立时,他会创建两个文件描述符: filedis[0]用于读管道,filedis[1]用于写管道. 管

C#中使用命名管道进行进程通信的实例

原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 2 实现项目Client Client仅包含一个名为"客户端"的窗体,如下图所示. 编写窗体后端代码,如下所示. using System; using System.IO; using System.IO.Pipes; using Syste

linux进程通信之命名管道

前一节学习了无名管道,这节学习命名管道. 二命名管道 无名管道只能用来在父子进程或兄弟进程之间进行通信,这就给没有亲缘关系的进程之间数据的交换带来了麻烦,解决这个问题就是本节要学习的另一种管道通信:命名管道. 命名管道也被称为FIFO文件,FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中.这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIF