A程序作为服务器,不断从B程序接收数据,并发送到C程序中:
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <Windows.h>
#include <process.h>
#include <stdlib.h>
const char *pStrPipeNameGet = "\\\\.\\pipe\\Name_pipe_demon_get";
const char *pStrPipeNameSend = "\\\\.\\pipe\\Name_pipe_demon_send";
const int BUFFER_MAX_LEN = 1024;
char buf[BUFFER_MAX_LEN];
DWORD dwLen;
HANDLE get, mSend, mutex;
LPCRITICAL_SECTION cs;
WCHAR* toWChar(const char *c)
{
WCHAR wszClassName[256];
memset(wszClassName, 0, sizeof(wszClassName));
MultiByteToWideChar(CP_ACP, 0, c, strlen(c) + 1, wszClassName,\
sizeof(wszClassName) / sizeof(wszClassName[0]));
return wszClassName;
}
void beginGetThread(PVOID p)
{
printf("服务器Get\n");
printf("等待连接......\n");
HANDLE hPipe = CreateNamedPipe(toWChar(pStrPipeNameGet),\
PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,\
PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0);
if (ConnectNamedPipe(hPipe, NULL) != NULL)//等待连接。
{
printf("连接成功,开始接收数据\n");
while (true)
{
WaitForSingleObject(mutex, INFINITE);
EnterCriticalSection(cs);//接收客户端发送的数据
ReadFile(hPipe, buf, BUFFER_MAX_LEN, &dwLen, NULL);
printf("接收到来自A的数据长度为%d字节\n", dwLen);
printf("具体数据内容如下:");
int bufSize;
for (bufSize = 0; bufSize < (int)dwLen; bufSize++)
{
putchar(buf[bufSize]);
}
LeaveCriticalSection(cs);
Sleep(500);
ReleaseSemaphore(mutex, 1, NULL);
putchar('\n');
}
}
else
{
printf("连接失败\n");
}
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);//关闭管道
}
void beginSendThread(PVOID p)
{
printf("服务器Send\n");
printf("等待连接......\n");
HANDLE hPipe = CreateNamedPipe(toWChar(pStrPipeNameSend),PIPE_ACCESS_DUPLEX,\
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,\
PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0);
if (ConnectNamedPipe(hPipe, NULL) != NULL)//等待连接。
{
printf("连接成功,开始发送缓冲区数据至B\n");
while (true)
{
WaitForSingleObject(mutex, INFINITE);
EnterCriticalSection(cs);
WriteFile(hPipe, buf, (int)dwLen, &dwLen, NULL);
LeaveCriticalSection(cs);Sleep(500);
ReleaseSemaphore(mutex, 1, NULL);
}
}
else
{
printf("连接失败\n");
}
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);//关闭管道
}
int _tmain(int argc, _TCHAR* argv[])
{
cs = (LPCRITICAL_SECTION)malloc(sizeof(LPCRITICAL_SECTION));
InitializeCriticalSection(cs);
mutex = CreateSemaphore(NULL, 1, 1, TEXT("mutex"));
_beginthread(beginGetThread, NULL, NULL);
_beginthread(beginSendThread, NULL, NULL);
Sleep(INFINITE);DeleteCriticalSection(cs);
return 0;
}

B程序不断接收从键盘输入的数据,数据以回车结束,并发送给A
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <conio.h>
const char *pStrPipeName = "\\\\.\\pipe\\Name_pipe_demon_get";
const int BUFFER_MAX_LEN = 1024;
char buf[BUFFER_MAX_LEN];
int _tmain(int argc, _TCHAR* argv[])
{
printf("按任意键以开始连接Get\n");
_getch();
printf("A开始等待......\n");
if (!WaitNamedPipe(pStrPipeName, NMPWAIT_WAIT_FOREVER))
{
printf("Error! 连接Get失败\n");
return 0;
}
HANDLE hPipe = CreateFile(pStrPipeName, GENERIC_WRITE, 0,NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
while (true)
{
printf("请输入要向服务端发送的数据,回车键结束,最大1024个字节\n");
DWORD dwLen = 0;
int bufSize;
for (bufSize = 0; bufSize < BUFFER_MAX_LEN; bufSize++)
{
buf[bufSize] = getchar();
if (buf[bufSize] == '\n') break;
}//向服务端发送数据
if (WriteFile(hPipe, buf, bufSize, &dwLen, NULL))
{
printf("数据写入完毕共%d字节\n", dwLen);
}
else
{
printf("数据写入失败\n");
}
Sleep(1000);
}
CloseHandle(hPipe);
return 0;
}

C程序接收到从A发送来的数据,并转换成大写写入文件
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <conio.h>
const char *pStrPipeName = "\\\\.\\pipe\\Name_pipe_demon_send";
const int BUFFER_MAX_LEN = 1024;
char buf[BUFFER_MAX_LEN];
DWORD dwLen = 0;
int _tmain(int argc, _TCHAR* argv[])
{
printf("按任意键以开始连接Send\n");
_getch();
printf("B开始等待......\n");
if (!WaitNamedPipe(pStrPipeName, NMPWAIT_WAIT_FOREVER))
{
printf("Error! 连接Send失败\n");
return 0;
}
HANDLE hPipe = CreateFile(pStrPipeName, GENERIC_READ, 0,NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
while (true)
{// 接收服务端发回的数据
ReadFile(hPipe, buf, BUFFER_MAX_LEN, &dwLen, NULL);//读取管道中的内容(管道是一种特殊的文件)
printf("接收服务端发来的信息,长度为%d字节\n", dwLen);
printf("具体数据内容如下:");
HANDLE hWrite = CreateFile(_T("data.txt"), GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
for (int j = 0; j <= (int )dwLen; j++)
{
putchar(buf[j]);
buf[j] = toupper(buf[j]);
}
putchar('\n');
SetFilePointer(hWrite, NULL, NULL, FILE_END);
WriteFile(hWrite, buf, (int)dwLen, NULL, NULL);
WriteFile(hWrite, "\n", 1, NULL, NULL);
CloseHandle(hWrite);
Sleep(1000);
}
CloseHandle(hPipe);
return 0;
}

http://www.qtcn.org/bbs/apps.php?q=diary&a=detail&did=2428&uid=176322

管道通信实例(A程序作为服务器,不断从B程序接收数据,并发送到C程序中)的更多相关文章

  1. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  2. 客户端程序通过TCP通信传送"小文件"到服务器

    客户端程序通过TCP通信传送"小文件"到服务器 [c#源码分享]客户端程序通过TCP通信传送"小文件"到服务器 源码  (不包含通信框架源码,通信框架源码请另行 ...

  3. C#命名管道通信

    C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI.发消息等.但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用.RMI又用的太多了,准备用管道通 ...

  4. C++和C#进程之间通过命名管道通信(上)

    C++和C#进程之间通过命名管道通信(上) "命名管道"是一种简单的进程间通信(IPC)机制.命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支 ...

  5. c# c++通信--命名管道通信

    进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c+ ...

  6. python多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  7. 循序渐进做项目系列(1):最简单的C/S程序——让服务器来做加法

    (本文是专门针对未接触过C/S开发的初学者而写的,C/S开发高手请自动忽略啊~~) 还在写“Hello world!”式的单机程序吗?还在各种拖控件吗?是否自己都觉得有点low呢?来个质的飞跃吧!看看 ...

  8. 最简单的C/S程序——让服务器来做加法

    还在写“Hello world!”式的单机程序吗?还在各种拖控件吗?是否自己都觉得有点low呢?来个质的飞跃吧!看看怎么让服务器帮咱做加法! 所谓C/S程序就是Client/Server程序,自然既包 ...

  9. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

随机推荐

  1. [Flow] The Fundamentals of Flow

    Install: yarn global add flow-typed /*get type defination*/ yarn add flow-bin -D For example you hav ...

  2. [Erlang]Mnesia分布式应用

    http://blog.csdn.net/erlib/article/details/40743687 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个 ...

  3. 短文评估【安徽省选2003】- hash / trie

    题目分析 其实是hash/trie裸题,讲一下hash的做法:如果其小写状态是第一次出现则加入集合,同时将小写状态加入小写单词的hash表,最后查时查出出现次数即可. code #include< ...

  4. 【t071】最长路

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n.设w[i,j]为边的长度.请计算图G中从1到n ...

  5. cocos2d-x 3.0学习游戏笔记的例子《卡塔防》第五步---开始建立游戏界面

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写.第一别全然照搬代码.第二能够说 ...

  6. 记排查octopress生成时的编码错误

    前些日子经若亮童鞋提醒,我在其他推荐的页面中增加了对 Dropbox 和 Linode 等工具的推荐,一来分享这些好用的产品,二来期望刚接触这些工具的好心的朋友可以不吝啬时间用我的推荐码注册,让我获得 ...

  7. Spring Boot with JSP and Tiles3

    Spring Boot with JSP and Tiles3 Using tiles and jsp on a Spring Boot 1.2.7 project file: pom.xml und ...

  8. html head标签的内容跑到body标签中 , 并且body中多了个空格

    今天遇到一个奇怪的问题 , 就是在head标签中写的内容跑到body标签中 , 第一种也是经常遇到的情况就是编码 UTF-8 格式带BOM的 , 这种情况是会多一个空格 , 这个基本都知道 , 按ut ...

  9. 发布与订阅SQLServer

    SQLServer 中发布与订阅 在对数据库做迁移的时候,会有很多方法,用存储过程,job,也可以用开源工具lettle,那么今天这些天变接触到了一种新的方法,就是SqlServer中自带的发布与订阅 ...

  10. mybatis如何实现分页功能?

    1)原始方法,使用limit,需要自己处理分页逻辑: 对于mysql数据库可以使用limit,如: select * from table limit 5,10; --返回6-15行 对于oracle ...