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

以上这篇C/C++ 进程通讯(命名管道)的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C++进程间共享数据实例

    本文实例讲述了C++进程间共享数据的实现方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: int main(int argc, char *argv[])  {      //RecursiveDelete("C:\\20_128\\");      //SelfRun("runModel");      //进程间内存共享      LPCTSTR lpName= "hello";      LPCTSTR lpConten

  • 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; HA

  • php超详细讲解命名管道

    目录 进程间为什么要通信 进程如何实现通信 常见进程通信方式 管道概念 命名管道实现 posix_mkfifo函数 无血缘进程间通信 进程间为什么要通信 进程间通信的目的: 数据传输:一个 进程需要将它的数据 发送给另一个进程. 通知事件:一个进程需要向另一个或一组进程 发送消息,通知它(它们)发生了 某种事件(如进程终止时要通知父进程). 资源共享:多个进程之间 共享同样的资源 .为了做到这一点,需要内核提供互斥和同步机制. 进程控制:有些进程 希望完全控制另一个进程的执行 (如 Debug

  • C#使用命名管道Pipe进行进程通信实例详解

    1.新建解决方案NamedPipeExample 新建两个项目:Client和Server,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 此Form1为Client的窗体,如下图所示. 后端代码,如下. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Syst

  • linux 命名管道实例详解

    linux进程间通信--命名管道 FIFO(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中.命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信.值得注意的是,FIFO(first input first output)总是按照先进先出的原则⼯作,第⼀个被写⼊的数据将⾸先从管道中读出. 创建命名管道的系统函数有两个:mknod和mkfifo.两个函数均定义在头⽂件sys/stat.

  • 详解Python进程间通信之命名管道

    管道是一种简单的FIFO通信信道,它是单向通信的. 通常启动进程创建一个管道,然后这个进程创建一个或者多个进程子进程接受管道信息,由于管道是单向通信,所以经常需要创建两个管道来实现双向通信. 命名管道是对传统管道的扩展,默认的管道是匿名管道,只在程序运行时存在:而命名管道是持久化的,当不需要时需要删除它. 命名管道使用文件系统,由mkfifo()方法创建.一旦创建了,两个独立的进程都可以访问它,一个读,另外一个写. 命名管道支持阻塞读和阻塞写操作: 如果一个进程打开文件读,它会阻塞直到另外一个进

  • vue中的非父子间的通讯问题简单的实例代码

    官网上的例子好晦涩,看了一个头两个大,关于非父子间的通讯问题,经过查阅得到了下面的例子, <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>兄弟之间的通讯问题</title> <script src="vue.js"></script> </head>

  • SQL2005 provider: 命名管道提供程序 error: 40 无法打开到 SQL Server 的连接

    ASP.net连接SQL 2005数据库出现错误提示:在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) 解决方法: 1.确保使用连接的用户名和密码可以正确登录到SQL2005.       2.确保服务器端的数据库允许远程连接,登录SQL2005企业管理器后,右键本机数据库点击"属性&qu

  • Linux进程控制详解及实例

    Linux进程控制详解及实例 常用函数: fork() 通过复制调用进程来建立新的进程,是最基本的进程建立操作. exec   包括一系列的系统调用,其中每个系统调用都完成相同的功能,即通过用一个新的程序覆盖原内存空间,来实现进程的转变.各种exec系统调用之间的区别仅在于它们的参数构造不同. wait() 它提供了初级的进程同步措施,能使一个进程等待,直到另一个进程结束为止. exit()  常用来终止一个进程的运行. 进程的建立 如果fork()调用成功,就会使内核建立一个新的进程,所建的新

  • 详解android webView独立进程通讯方式

    为什么需要将webView放在独立进程 webView 加载网页的时候可能占用大量内存,导致应用程序OOM. webView 在访问结束的时候可以直接杀死该进程,防止内存泄漏. webView 在崩溃的时候不影响主进程. webView独立进程需要注意什么 由于进程之间内存是独立的,所以导致了Appcation, 静态类需要在新的进程重新创建. 内存中的数据不共享,需要跨进程通讯. 如何声明一个独立进程 在默认情况下,同一应用的所有组件都在相同的进程中运行. 在Manifest中可以设置各组件

  • java文件的重命名与移动操作实例代码

    文件的重命名与移动操作 有时候为了对文件进行统一访问与管理,需要把文件进行重命名,并移动到新的文件夹,如何实现呢? 一枚简单的java小程序即可实现: part_1:需求:我需要把<(E:\BaiduYun\传智播客_张孝祥_Java多线程与并发库高级应用视频教程下载)>文件夹下的所有子文件夹下的视频文件重命名,并移动到新的位置<(E:\BaiduYun\张孝祥_Java多线程与并发库)>; part_2:目录结构如下: E:\BaiduYun E:\BaiduYun\传智播客_张

随机推荐