C++ 进程间的通讯(一):简单的有名管道实现
来源:互联网 发布:企业信息搜索软件 编辑:程序博客网 时间:2024/05/22 03:37
进程间的通讯(一):简单的有名管道实现
一 管道简介
命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
其优点是实现起来比较简单方便.
缺点是会使进程之间的代码耦合度增加.并且管道通信只适用于同一台主机上的进程之间通讯.
二 实现代码
Server Code:
#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)==NULL)//阻塞等待客户端连接。{printf("Connection failed!\n");}else{printf("Connection Success!\n");}while (true){if(ReadFile(hPipe,buf,256,&rlen,NULL)==FALSE) //接受客户端发送过来的内容{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);}}CloseHandle(hPipe);//关闭管道}system("PAUSE");return 0;}
Clietn Code:
#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;}
0 0
- C++ 进程间的通讯(一):简单的有名管道实现
- 利用有名管道,实现两个独立进程间的通讯
- 进程间的通讯之有名管道
- 进程间的通讯方式_管道(有名管道)
- 进程间通讯(一) 有名管道
- 进程间通讯-有名管道
- Linux进程间通讯--管道(有名管道
- 简单的实现在有名管道里,进程间的通信(非阻塞)。
- 进程间通讯——有名管道
- 有名管道的实现
- 进程间的通信----有名管道fifo
- 进程间通讯——管道(有名管道)
- 通过有名管道实现两个进程单向通讯
- linux中利用有名管道实现进程之间的通信
- 有名管道实现进程间通信。
- Linux 进程间通讯之有名管道方式
- Linux 进程间通讯之有名管道方式
- 有名管道在无亲缘进程间的通信
- Eclipse下编写C++程序——CDT环境搭建
- C3P0的配置方式
- nyoj-111-分数加减法
- HBase 官方文档
- 《读书笔记》设计模式——开放-封闭原则
- C++ 进程间的通讯(一):简单的有名管道实现
- javascript闭包,作用域,自调用匿名函数
- Linux:访问光盘的命令
- Hbase入门之三HBase Client API使用入门1
- 关于linux系统端口查看和占用的解决方案
- Asp.net utf-8 编码中文乱码完全解决方案
- HBase入门之四HBase JAVA WEB客户端
- Bbase入门之五hbase实现web 小实例
- Android获取控件在手机屏幕上的位置