// 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. 图解jvm--(一)jvm内存结构

    jvm内存结构 1.程序计数器 1.1 定义 Program Counter Register 程序计数器(寄存器) 作用,记住下一条jvm指令的执行地址 特点 是线程私有的 (唯一)不会存在内存溢出 ...

  2. 3(计算机网络)ifconfig:最熟悉又陌生的命令行

    当面试听到这个问题的时候,面试者常常会觉得走错了房间.我面试的是技术岗位啊,怎么问这么简单的问题? 的确,即便没有专业学过计算机的人,只要倒腾过电脑,重装过系统,大多也会知道这个问题的答案:在 Win ...

  3. 1-m*n循环填数(用标记数组)blibli2018秋招第三题一个类型

    #include <iostream> #include<string> #include<algorithm> using namespace std; ; in ...

  4. 《Netlogo多主体建模入门》笔记3

    3- 用“生命游戏”认识Patch     代码:   patches-own[living] to setup clear-all ask patches [ < 0.3[ set pcolo ...

  5. 实验吧-杂项-WTF?(python 01代码转图片)

    比较新的题型了吧. code为base64码,转码出来是01代码,直接蒙圈,查阅相关wp才知道是转图片的. 复制到编辑器里可以看到一共65536个数字,开方是256,于是这就是一个方形的图片了–> ...

  6. sass计算高度

    页面布局时,有时候需要两个div充满父div空间,设定一个div尺寸后,可以使用css计算高度设置另一个尺寸: <style> .wrap{ width:1000px; } .left{ ...

  7. chart 模板【转】

    Helm 通过模板创建 Kubernetes 能够理解的 YAML 格式的资源配置文件,我们将通过例子来学习如何使用模板. 以 templates/secrets.yaml 为例: 从结构看,文件的内 ...

  8. shell教程——bash入门

    创建shell文件 vim test.sh 写内容 #!/bin/bash echo "Hello World !" 使脚本具有执行权限 chmod +x ./test.sh 执行 ...

  9. helloctf.exe ----攻防世界

    下载附件之后,查壳发现没有壳,运行试试看 很平常的输入代码,然后ida查看一下,开始就发现一个注意的地方,但是还是继续向下看, 结果就是CrackMeJustForFun

  10. ROS大型工程学习(三) ROS常用命令行

    1.rosbag 对ros包进行操作的命令. (1)录制包: rosbag record -a //录制数据包,所有topic都录制 rosbag record /topic_name1 /topic ...