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身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名 ...
随机推荐
- Revolver Maps-3D地球仪网站定制
这是个网站统计的小插件,大家可以看到那些国家,哪些城市对本网站进行了访问,很直观的一种表现方式. 这个小插件不需要你写任何代码,只需要去它官方网站定制你自己需要的代码.它的地址是:http://www ...
- TFServering和docker
nvidia-docker安装:https://github.com/NVIDIA/nvidia-docker nvidia-docker的基本操作:https://blog.csdn.net/pan ...
- 配置本地yum仓库
前言 我们知道yum工具是基于rpm的,其一个重要的特性就是可以自动解决依赖问题,但是yum的本质依旧是把后缀名.rpm的包下载到本地,然后按次序安装之.但是每次执行yum install x ...
- 解决扫码枪输入input时受中文输入法的影响
<html><head> <meta content="text/html; charset=UTF-8" http-equiv="Cont ...
- [USACO2009 OPEN] 滑雪课 Ski Lessons
洛谷P2948 看到题目就觉得这是动规但一直没想到如何状态转移……看了别人的题解之后才有一些想法 f[i][j]:前i单位时间能力值为j可以滑的最多次数 lessons[i][j]:结束时间为i,获得 ...
- 关于本地使用antd的upload组件上传文件,ngnix报错405的问题
使用阿里的ui框架antd的upload,会自动请求ngnix上面的一个路径,也就是action所在的位置,一直报错405 not allowed,后来经讨论,统一将action写成一个路径,后端对这 ...
- 【leetcode】1138. Alphabet Board Path
题目如下: On an alphabet board, we start at position (0, 0), corresponding to character board[0][0]. Her ...
- 3D打印格式STL
STL格式及其转换 近期接触了3D打印的一些东西,也制作了一个vrml转stl的插件,对该领域多了一些认识. 目前尚没有打印机直接支持stl.obj等格式,在打印之前需使用厂家提供的软件将stl等格式 ...
- oracle java for ubuntu apt-get
oracle java PPA: ppa:webupd8team/javathe key word use for search more infomation: webupd8team
- Oracle的分页和MySQL的分页
Oracle的分页: select * from ( select rownum r,a from tabName where rownum <= 20 ) where r > 10 使用 ...