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. [DevExpress]DevExpress 中 汉化包 汉化方法

    第一步: 在Debug 下加入 zh-CN 汉化包(自行下载) 第二步: 在 Program.cs中加入下面代码 : System.Threading.Thread.CurrentThread.Cur ...

  2. 自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)

    运行效果 实现方法 1.给按钮加上BS_OWNERDRAW样式2.重载DrawItem函数,在这里绘制按钮3.关键之处就是把父窗口的背景复制到按钮上,实现视觉上的透明4.最后通过AlphaBlend实 ...

  3. 征服OA 飞鱼工作流程的在线培训课程(两)HTML形成基于

    表HTML的重要作用,等效混凝土框架建筑的行,于div在此之前流行.是否所有形式的世界.在角色表页面主要是针对页面布局和定位.通过整合人才规划表设计出合理的页面布局. 当然.更重要的是,存在是表示数据 ...

  4. jquery大事-resize()办法

    为了形成用于电流大小的缩放对象构造监控事件. JQuery提供resize大事.在每一个匹配元素的resize函数到事件绑定,让我们适应窗口大小.对齐等.,档窗体改变大小时触发 这里有两种监听方式,一 ...

  5. 一个2013届毕业生(踏上IT行业)的迷茫(5)

    很快就到了该找工作的时间了,听说这一年是历史上找工作的人对多的一年,我也不知道是怎么统计的,可信不可信.跑了大概快一个月了,终于有offer了,就这样在这里实习了3个月,一直工作到现在. 回忆了整个学 ...

  6. jQuery怎么选择两个class属性

    Jquery选择多个Class属性: $('.className1,.className2,.className4,.className5')

  7. so文件成品评论【整理】

    这是我的 @布加迪20 AZ在一篇文章中写道:<汉化so文件的心得>中的技术附件做的简洁性整理.原来的看起来不是非常方便.一起分享学习.. 正文 SO文件汉化心得 --By布加迪20   ...

  8. 衡量镜头解像能力性能的指标-MTF曲线

    MTF(Modulation Transfer Function,模量传递函数),是目前分析镜头解像能力的方法,可以用来评判镜头还原物体对比度的能力.说到MTF,不得不先提一下衡量镜头性能的两在重要指 ...

  9. jQuery中对象的构建

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. options.parse === void 0

    if (options.parse === void 0) options.parse = true; https://developer.mozilla.org/zh-CN/docs/Web/Jav ...