C++ 命名管道示例
想做一个 Hook CreateFile 重定向到内存的功能,貌似可以假借命名管道实现这个功能。不熟悉命名管道,做了几个demo,如下:
Server:
// NamedPipeServer.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hPipe = CreateNamedPipe(L"\\\\.\\Pipe\\mypipe",PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT
,PIPE_UNLIMITED_INSTANCES,,,NMPWAIT_WAIT_FOREVER,); //waiting to be connected
if(ConnectNamedPipe(hPipe, NULL) == NULL)
return ; DWORD dwWrite;
const char *pStr = "data from server";
if( !WriteFile(hPipe, pStr, strlen(pStr), &dwWrite, NULL) )
{
cout << "write failed..." << endl<< endl;
return ;
}
cout << "sent data: " << endl << pStr<< endl<< endl; system("pause");
return ;
}
Client:
// NamedPipeClient.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;
#define BUFSIZE 5 int _tmain(int argc, _TCHAR* argv[])
{
if (WaitNamedPipe(L"\\\\.\\Pipe\\mypipe", NMPWAIT_WAIT_FOREVER) == FALSE)
return ; HANDLE hPipe=CreateFile(L"\\\\.\\Pipe\\mypipe", GENERIC_READ | GENERIC_WRITE, ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if((long)hPipe == -)
return ; BOOL fSuccess = false;
DWORD len = ;
char buffer[BUFSIZE];
string recvData = "";
do
{
fSuccess = ReadFile(hPipe ,buffer ,BUFSIZE*sizeof(char) ,&len ,NULL);
char buffer2[BUFSIZE+] = {};
memcpy(buffer2,buffer,len);
recvData.append(buffer2);
if(!fSuccess || len < BUFSIZE)
break;
}while(true); cout<<"recv data:"<<endl<<recvData.c_str()<<endl<<endl; FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe); system("pause");
return ;
}
Server & Client:
// MultiThreadDemo.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;
#define BUFSIZE 5 DWORD WINAPI ThreadFunction(LPVOID lpParam)
{
wstring* pipeName = static_cast<wstring*>(lpParam); HANDLE hPipe = CreateNamedPipe((*pipeName).c_str(),PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT
,PIPE_UNLIMITED_INSTANCES,,,NMPWAIT_WAIT_FOREVER,); //waiting to be connected
if(ConnectNamedPipe(hPipe, NULL) == NULL)
return ; DWORD dwWrite;
const char *pStr = "data from server";
if( !WriteFile(hPipe, pStr, strlen(pStr), &dwWrite, NULL) )
{
cout << "write failed..." << endl<< endl;
return ;
}
cout << "sent data: " << endl << pStr<< endl<< endl;
} int _tmain(int argc, _TCHAR* argv[])
{
wstring pipeName = L"\\\\.\\Pipe\\mypipe"; DWORD dwThreadID = ;
HANDLE hThread = CreateThread(NULL, , ThreadFunction, &pipeName , , &dwThreadID); Sleep(); if (WaitNamedPipe(pipeName.c_str(), NMPWAIT_WAIT_FOREVER) == FALSE)
return ; HANDLE hPipe=CreateFile(pipeName.c_str(), GENERIC_READ | GENERIC_WRITE, ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if((long)hPipe == -)
return ; BOOL fSuccess = false;
DWORD len = ;
char buffer[BUFSIZE];
string recvData = "";
do
{
fSuccess = ReadFile(hPipe ,buffer ,BUFSIZE*sizeof(char) ,&len ,NULL);
char buffer2[BUFSIZE+] = {};
memcpy(buffer2,buffer,len);
recvData.append(buffer2);
if(!fSuccess || len < BUFSIZE)
break;
}while(true); cout<<"recv data:"<<endl<<recvData.c_str()<<endl<<endl; FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe); system("pause");
return ;
}
C++ 命名管道示例的更多相关文章
- Linux进程间通信-命名管道
前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...
- C#命名管道通信
C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI.发消息等.但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用.RMI又用的太多了,准备用管道通 ...
- 命名管道FIFO和mkfifo函数
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...
- 邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#
邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系 ...
- c# c++通信--命名管道通信
进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c+ ...
- shell 匿名管道和命名管道
管道的特点:如果管道中没有数据,那么取管道数据的操作就会滞留,直到管道内进入数据,然后读出后才会终止这一操作:同理,写入管道的操作如果没有读取管道的操作,这一动作也会滞留. 1,匿名管道 匿名管道使用 ...
- 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行
背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...
- Windows进程间通信—命名管道
命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节.我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信.与Socket网络通信相比,命名管道不再需要编写身份验证的代码.将 ...
- Linux学习笔记(13)-进程通信|命名管道
匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名 ...
随机推荐
- vue梳理(1)
单选/复选 <div id="app"> <!--checkbox需要给每个复选双向绑定同一个数据,并添加value值, 点击某个复选时就会把该复选的value值 ...
- jQuery实现动态时间
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...
- Nginx设置上传文件大小限制
就是nginx对上传的图片大小有了限制嘛,所以更改nginx的配置文件就好了 client_max_body_size 1000m; 参考:https://blog.csdn.net/TitanSee ...
- octave - 用于数值计算的高级交互式语言
SYNOPSIS 总览 octave [options] OPTIONS 选项 octave 全部命令行选项可以通过运行命令 octave --help 来查看. DESCRIPTION 描述 Oct ...
- 编写第一个Qt程序
http://c.biancheng.net/view/1817.html 学习一种编程语言或编程环境,通常会先编写一个“Hello World”程序.我们也用 Qt Creator 编写一个“Hel ...
- @Component和@Bean以及@Autowired、@Resource
1. 有这么一个故事,从xml配置文件的bean说起 Spring用xml配置文件的时候(不知道阅读这篇文章的你用没用过,我用过一段时间,那是黑暗伤痛的回忆QQQ),一个xml配置文件里面有很多个 ...
- kali安装docker以及配置阿里云镜像加速
1.需求 最近需要用到docker比较多,遂安装使用下,第一次用docker搭建测试环境,不得不说,docker真香.期间遇到了比较多奇奇怪怪的问题,网上的教程也比较多比较乱,遂记录一下. 2.安装d ...
- iView栅格的使用
一般情况下栅格系统都会把每行row分为12列,但是iview是采用了24栅格系统,将区域进行24等分 基础用法 实例代码: <template> <Row> <Col s ...
- LTM_本地流量管理(一)
基本元素及概念 Node:节点,即服务器的IP地址. Member:成员,即一个服务,用IP+端口表示. Pool:池:一个或多个Member的逻辑分组,一个Pool表示一个应用,每个Pool都有自己 ...
- linux运维、架构之路-rpm定制、本地yum仓库搭建
一.定制rpm包 1.环境 [root@m01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@m01 ~]# uname - ...