// PipeServer.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <process.h>
using namespace std;
#pragma warning(disable:4996) HANDLE hClose = NULL; unsigned int _stdcall ProcessPipe(void *lp)
{
HANDLE hPipeServer = (HANDLE)lp;
BYTE btRead[MAX_PATH] = {0}; DWORD dwTime = GetTickCount();
while (GetTickCount() - dwTime < 10000){
DWORD dwRead = 0;
BOOL bRet = ReadFile(hPipeServer, btRead, MAX_PATH, &dwRead, NULL);
if (!bRet){
if (GetLastError() == ERROR_BROKEN_PIPE ){
break;
}
}
else{
printf("%s\n", btRead);
ZeroMemory(btRead, MAX_PATH);
strcpy((char*)btRead, "RecvInfo");
DWORD dwWrite = 0;
bRet = WriteFile(hPipeServer, btRead, strlen((char*)btRead), &dwWrite, NULL);
}
Sleep(20);
} SetEvent(hClose);
DWORD dwExitCode = 0;
GetExitCodeThread(GetCurrentThread(), &dwExitCode);
_endthreadex(dwExitCode);
return 0;
} int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hPipeServer = CreateNamedPipe(L"\\\\.\\pipe\\pipeServer",
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
4096,
4096,
NMPWAIT_USE_DEFAULT_WAIT,
NULL
);
if (hPipeServer == INVALID_HANDLE_VALUE){
printf("CreateNamedPipe failed with error %d", GetLastError());
return 0;
} BOOL bRet = ConnectNamedPipe(hPipeServer, NULL);
if (!bRet){
printf("ConnectNamedPipe failed with error %d", GetLastError());
return 0;
} hClose = CreateEvent(NULL, true, false, NULL);
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ProcessPipe, (LPVOID)hPipeServer, 0, NULL);
CloseHandle(hThread); WaitForSingleObject(hClose, INFINITE);
CloseHandle(hPipeServer); return 0;
}

.cpp

// PipeClient.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <windows.h>
#include <process.h>
using namespace std;
#pragma warning(disable:4996) int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hPipe = CreateFile(
L"\\\\.\\pipe\\pipeServer", // pipe name
GENERIC_READ | GENERIC_WRITE,
0, // no sharing
NULL, // default security attributes
OPEN_EXISTING, // opens existing pipe
0, // default attributes
NULL); char strInfo[MAX_PATH] = {0};
strcpy(strInfo, "12sdfgsgdfg");
DWORD dwWrite = 0;
WriteFile(hPipe, strInfo, strlen(strInfo), &dwWrite, NULL);
Sleep(500);
ZeroMemory(strInfo, MAX_PATH);
DWORD dwRead = 0;
ReadFile(hPipe, strInfo, MAX_PATH, &dwRead, NULL);
printf("%s\n", strInfo);
Sleep(8000);
CloseHandle(hPipe);
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ 管道的更多相关文章

  1. ASP.NET Core HTTP 管道中的那些事儿

    前言 马上2016年就要过去了,时间可是真快啊. 上次写完 Identity 系列之后,反响还不错,所以本来打算写一个 ASP.NET Core 中间件系列的,但是中间遇到了很多事情.首先是 NPOI ...

  2. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  3. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  4. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  5. 【翻译】MongoDB指南/聚合——聚合管道

    [原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...

  6. 学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?

    注册的服务器和中间件共同构成了ASP.NET Core用于处理请求的管道, 这样一个管道是在我们启动作为应用宿主的WebHost时构建出来的.要深刻了解这个管道是如何被构建出来的,我们就必须对WebH ...

  7. 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter

    中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现.所谓 ...

  8. 学习ASP.NET Core, 怎能不了解请求处理管道[4]: 应用的入口——Startup

    一个ASP.NET Core应用被启动之后就具有了针对请求的处理能力,而这个能力是由管道赋予的,所以应用的启动同时意味着管道的成功构建.由于管道是由注册的服务器和若干中间件构成的,所以应用启动过程中一 ...

  9. 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的

    我们在<服务器在管道中的"龙头"地位>中对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了介绍,为了让读者朋友们对管道中的服务器具有更 ...

  10. 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位

    ASP.NET Core管道由注册的服务器和一系列中间件构成.我们在上一篇中深入剖析了中间件,现在我们来了解一下服务器.服务器是ASP .NET Core管道的第一个节点,它负责完整请求的监听和接收, ...

随机推荐

  1. js动态添加li,你添加的li具有你绑定的事件

    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <%@page i ...

  2. mysql explain参数解析

    建表语句 -- ---------------------------- -- Records of departments -- ---------------------------- INSER ...

  3. 题解 loj2065 「SDOI2016」模式字符串

    点分治. 考虑经过当前分治中心\(u\)的点对数量. 这种数点对数的问题,有一个套路.我们可以依次考虑\(u\)的每个儿子,看用当前的儿子,能和之前已经考虑过的所有儿子,组成多少点对.这样所有合法的点 ...

  4. 环境变量方式使用 Secret【转】

    通过 Volume 使用 Secret,容器必须从文件读取数据,会稍显麻烦,Kubernetes 还支持通过环境变量使用 Secret. Pod 配置文件示例如下: 创建 Pod 并读取 Secret ...

  5. MyBatis源码部分简单地解析

    . 一.解析xml: > org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream, java.l ...

  6. Fiddler里面AutoResponder和mock用法

    AutoResponder 1.找到对应图片请求的链接 2.操作步骤如下图: mock 使用场景:上一步骤模块没有完成,但是下一步模块完成了,需要使用到快速模拟,主要使用的地方就是测试接口

  7. Java从.CSV文件中读取数据和写入

    .CSV文件是以逗号分割的数据仓储,读取数据时从每一行中读取一条数据元祖,也就是一条数据,再用字符分割的方式获取表中的每一个数据项. import java.io.BufferedReader;    ...

  8. 深入理解JVM Note

    第2章 Java内存区域与内存溢出异常 运行时数据区域 在虚拟机有栈.堆和方法区. 线程共享的:堆.方法区 不共享的:栈.程序计数器(代码执行的行号) 程序计数器(Program Counter Re ...

  9. Vue父组件向子组件传值

    父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据 <script> // 创建 Vue 实例,得到 ViewModel var vm = ne ...

  10. oracle job不运行,定位问题

    一. job的运行频率设置 1.每天固定时间运行,比如早上8:10分钟:Trunc(Sysdate+1) + (8*60+10)/24*60 2.Toad中提供的: 每天:trunc(sysdate+ ...