78.pipe多管道云端,客户端通信
压力测试截图:
云端
- 定义管道缓存区大小,最多连接数量(线程个数),当前线程个数,管道名字
//缓冲区大小
#define SIZE 4096
//最多连接数量
#define MAX_CONNECT 128
//一开始有10个线程存在
int startthreadnum = ;
//管道名字
char pipename[] = "\\\\.\\Pipe\\cloudpipe"; - 创建结构体,存储线程,管道和事件的信息
//创建结构体,存储线程,管道和事件的信息
typedef struct info
{
HANDLE hthread;
HANDLE hpipe;//管道信息
HANDLE hevent;//事件用于初始化一个结构体用于连接管道,并存储连接的信息
}PIPE_ST; - 创建结构体
//128个结构体
PIPE_ST pipeinst[MAX_CONNECT]; - 初始化结构体,并开启线程
//创建管道,事件,并启动线程
void start()
{
for (int i = ; i <startthreadnum; i++)
{
//创建管道,如果同名则操作同一个管道
pipeinst[i].hpipe = CreateNamedPipeA(
pipename,//管道名称
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,//管道读写属性
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,//消息模式,读模式,等待模式阻塞
,//最多使用本管道的实例个数
,//输出缓冲区大小
,//输入缓冲区大小
,//超时,无限等待
NULL);
if (pipeinst[i].hpipe == INVALID_HANDLE_VALUE)
{
printf("\n%d失败",i);
return;
}
//创建事件
pipeinst[i].hevent = CreateEventA(NULL, FALSE, FALSE, FALSE);//创建事件
//创建线程
pipeinst[i].hthread=CreateThread(NULL,,severThread,&pipeinst[i],,NULL);
}
printf("sever start"); } - 线程函数
//服务器线程
DWORD WINAPI severThread(void *lp)
{
//存储读取的数量
DWORD nread = ;
//存储写入的数量
DWORD nwrite = ;
//检测IO是否完成
DWORD dwbyte = ;
char szbuf[SIZE] = { }; //获取当前结构体
PIPE_ST curpipe = *(PIPE_ST*)lp;
//用事件初始化一个结构体用于连接管道,存储连接的信息
OVERLAPPED overlap = { , , , , curpipe.hevent }; while ()
{
//数据清零
memset(szbuf, , sizeof(szbuf));
//链接上管道,并把信息写入overlap
ConnectNamedPipe(curpipe.hpipe, &overlap);
//等待
WaitForSingleObject(curpipe.hevent, INFINITE);
//检测IO,如果完成就跳出
if (!GetOverlappedResult(curpipe.hpipe,&overlap,&dwbyte,TRUE))
{
break;
}
//读取管道中的数据到szbuf中
if (!ReadFile(curpipe.hpipe,szbuf,SIZE,&nread,NULL))
{
puts("read fail");
break;
}
//从读取的数据中获取数据
int a, b;
sscanf(szbuf, "%d %d", &a, &b);
//缓存区清零
memset(szbuf, , sizeof(szbuf));
//计算结果
sprintf(szbuf, "%d", a + b);
//把结果写入管道
WriteFile(curpipe.hpipe, szbuf, strlen(szbuf), &nwrite, NULL);
//断开连接
DisconnectNamedPipe(curpipe.hpipe);
}
return ;
}
客户端
- 定义管道缓存区大小,管道名字,以及管道连接的句柄
#define SIZE 4096
char pipename[] = "\\\\.\\Pipe\\cloudpipe";
HANDLE m_pipe = NULL; - 生成随机数用于给服务器进行计算
int a;
int b;
void run()
{
time_t ts;
unsigned int num = time(&ts);
srand(num);
a = rand() % ;
b= rand() % ;
} - 打开管道,并向管道中写入数据,再读取计算后的结果
m_pipe = CreateFileA(pipename, //名称
GENERIC_WRITE | GENERIC_READ,//读写
,//共享属性,1独有
NULL,//默认安全属性
OPEN_EXISTING,//打开已经存在的
FILE_ATTRIBUTE_NORMAL,
NULL); if (m_pipe==INVALID_HANDLE_VALUE)
{
printf("失败");
return;
}
//存储读取写入了多少个
int nwrite;
int nread;
//生成随机数
run();
//存储写入的数据
char winfo[] = { };
//格式到winfo中
sprintf(winfo, "%d %d", a, b);
//写入管道
WriteFile(m_pipe, winfo, strlen(winfo), &nwrite, NULL);
//清零
memset(winfo, , sizeof(winfo));
//读取管道计算后的数据到winfo中
ReadFile(m_pipe, winfo, , &nread, NULL);
//获取服务器计算的结果
int res;
sscanf(winfo, "%d", &res);
printf("\n%d+%d=%d", a, b, res);
服务器端完整代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h> //缓冲区大小
#define SIZE 4096
//最多连接数量
#define MAX_CONNECT 128
//一开始有10个线程存在
int startthreadnum = ;
//管道名字
char pipename[] = "\\\\.\\Pipe\\cloudpipe"; //创建结构体,存储线程,管道和事件的信息
typedef struct info
{
HANDLE hthread;
HANDLE hpipe;//管道信息
HANDLE hevent;//事件用于初始化一个结构体用于连接管道,并存储连接的信息
}PIPE_ST; //128个结构体
PIPE_ST pipeinst[MAX_CONNECT]; //服务器线程
DWORD WINAPI severThread(void *lp)
{
//存储读取的数量
DWORD nread = ;
//存储写入的数
DWORD nwrite = ;
//检测IO是否完成
DWORD dwbyte = ;
char szbuf[SIZE] = { }; //获取当前结构体
PIPE_ST curpipe = *(PIPE_ST*)lp;
//用事件初始化一个结构体用于连接管道,存储连接的信息
OVERLAPPED overlap = { , , , , curpipe.hevent }; while ()
{
//数据清零
memset(szbuf, , sizeof(szbuf));
//链接上管道,并把信息写入overlap
ConnectNamedPipe(curpipe.hpipe, &overlap);
//等待
WaitForSingleObject(curpipe.hevent, INFINITE);
//检测IO,如果完成就跳出
if (!GetOverlappedResult(curpipe.hpipe,&overlap,&dwbyte,TRUE))
{
break;
}
//读取管道中的数据到szbuf中
if (!ReadFile(curpipe.hpipe,szbuf,SIZE,&nread,NULL))
{
puts("read fail");
break;
}
//从读取的数据中获取数据
int a, b;
sscanf(szbuf, "%d %d", &a, &b);
//缓存区清零
memset(szbuf, , sizeof(szbuf));
//计算结果
sprintf(szbuf, "%d", a + b);
//把结果写入管道
WriteFile(curpipe.hpipe, szbuf, strlen(szbuf), &nwrite, NULL);
//断开连接
DisconnectNamedPipe(curpipe.hpipe);
}
return ;
} //创建管道,事件,并启动线程
void start()
{
for (int i = ; i <startthreadnum; i++)
{
//创建管道
pipeinst[i].hpipe = CreateNamedPipeA(
pipename,//管道名称
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,//管道读写属性
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,//消息模式,读模式,等待模式阻塞
,//最多使用本管道的实例个数
,//输出缓冲区大小
,//输入缓冲区大小
,//超时,无限等待
NULL);
if (pipeinst[i].hpipe == INVALID_HANDLE_VALUE)
{
printf("\n%d失败",i);
return;
}
//创建事件
pipeinst[i].hevent = CreateEventA(NULL, FALSE, FALSE, FALSE);//创建事件
//创建线程
pipeinst[i].hthread=CreateThread(NULL,,severThread,&pipeinst[i],,NULL);
}
printf("sever start"); } void main()
{
start();
system("pause");
}
客户端完整代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h> #define SIZE 4096
char pipename[] = "\\\\.\\Pipe\\cloudpipe";
HANDLE m_pipe = NULL; int a;
int b;
void run()
{
time_t ts;
unsigned int num = time(&ts);
srand(num);
a = rand() % ;
b= rand() % ;
} void main()
{
m_pipe = CreateFileA(pipename, //名称
GENERIC_WRITE | GENERIC_READ,//读写
,//共享属性,1独有
NULL,//默认安全属性
OPEN_EXISTING,//打开已经存在的
FILE_ATTRIBUTE_NORMAL,
NULL); if (m_pipe==INVALID_HANDLE_VALUE)
{
printf("失败");
return;
}
//存储读取写入了多少个
int nwrite;
int nread;
//生成随机数
run();
//存储写入的数据
char winfo[] = { };
//格式到winfo中
sprintf(winfo, "%d %d", a, b);
//写入管道
WriteFile(m_pipe, winfo, strlen(winfo), &nwrite, NULL);
//清零
memset(winfo, , sizeof(winfo));
//读取管道计算后的数据到winfo中
ReadFile(m_pipe, winfo, , &nread, NULL);
//获取服务器计算的结果
int res;
sscanf(winfo, "%d", &res);
printf("\n%d+%d=%d", a, b, res);
system("pause");
}
压力测试代码
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h> void main()
{ while ()
{
for (int i = ; i < ;i++)
{
ShellExecuteA(NULL, "open", "E:\\工具\\20150523\\pipe\\Debug\\客户端.exe", NULL, NULL, );
Sleep();
} } }
78.pipe多管道云端,客户端通信的更多相关文章
- C#中使用命名管道进行进程通信的实例
原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用 ...
- C#Winform窗体实现服务端和客户端通信例子(TCP/IP)
Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...
- JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
- C#使用Socket实现一个socket服务器与多个socket客户端通信
在分布式调度系统中,如果要实现调度服务器与多台计算节点服务器之间通信,采用socket来实现是一种实现方式,当然我们也可以通过数据存储任务,子节点来完成任务,但是往往使用数据作为任务存储都需要定制开发 ...
- Python_服务器与多客户端通信、UDP协议、pycharm打印带颜色输出、时间同步的机制
1.服务器与多客户端通信 import socket # 创建tcp socket的套接字 sk = socket.socket() # bind sk.bind(('127.0.0.1',8080) ...
- C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法
C#调用接口注意要点 在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...
- 使用CBrother做TCP服务器与C++客户端通信
使用CBrother脚本做TCP服务器与C++客户端通信 工作中总是会遇到一些对于服务器压力不是特别大,但是代码量比较多,用C++写起来很不方便.对于这种需求,我选择用CBrother脚本做服务器,之 ...
- C# Socket服务端与客户端通信(包含大文件的断点传输)
步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤: (1)建立一个Socket (2)接收 ...
- Java实例练习——基于UDP协议的多客户端通信
昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...
随机推荐
- 金融项目java开发_BigDecimal(解决计算精度问题)
当使用double进行商业运算时,double计算会丢失精度.可以使用BigDecimal进行计算. import java.math.BigDecimal; import org.junit.Tes ...
- python main函数
关于Python的主(main)函数问题 2007-07-23 19:14 初次接触Python的人会很不习惯Python没有main主函数.这里简单的介绍一下,在Python中使用main函数的方法 ...
- ArcGIS api for javascript——地理处理任务-服务区域任务
描述 本例展示了如何发送一些输入值到ArcGIS Server上的GIS模型并获得结果反馈给web应用.本例中,模型计算自在地图上单击点起始的驱动时间多边形. 例如,这个分析类型可用于想要知道多少人生 ...
- File的getPath()和getAbsolutePath()和getCanonicalPath()的差别
这几个方法是有一次无意的发现,我当时也不知道什么意思,就百度了,查到了一些列子: 原文地址http://www.blogjava.net/dreamstone/archive/2007/08/08/1 ...
- 在Linux终端使用W3M浏览器下载文件
在Linux终端使用W3M浏览器下载文件 W3M 是3个基于Linux系统命令行的WEB网站浏览工具(w3m/Links/Lynx) 对于需要验证cookie 和来源的页面,比如163的超大附件,直接 ...
- dropify,不错的图片上传预览插件
引言 传统的图片上传,很丑.点击选择之后,还无法预览. 有一种方案是传到服务器,然后返回地址,然后显示,比较麻烦. 用这个dropify,就可以解决之歌问题. 看效果 用法 1.引入文件,需要jque ...
- 9.ng-options
转自:https://www.cnblogs.com/best/tag/Angular/ 该指令允许你基于一个迭代表达式添加选项 <select ng-model="color&quo ...
- spring配置 quartz-config.xml
<!-- 配置调度程序quartz ,其中配置JobDetail有两种方式--> <!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现 ...
- 在performancepoint里面建立数据源的时候,总是发生以下的报警
就是我在performancepoint里面建立数据源的时候,总是发生以下的报警. 在管理中心主页的“应用程序管理”部分,单击“管理服务应用程序”,然后单击“PerformancePoint Se ...
- cd---切换工作目录
cd命令用来切换工作目录至dirname. 其中dirName表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录).另外,~也表 ...