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的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...
随机推荐
- HDU 3277 Marriage Match III
Marriage Match III Time Limit: 4000ms Memory Limit: 32768KB This problem will be judged on HDU. Orig ...
- vmware启动虚拟机报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine is stored is almost full. To continue, free an additional 1.4 GB of disk space.
报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine i ...
- centos同步网络北京时间
sudo yum -y install ntpdate ntp sudo ntpdate time.windows.com sudo hwclock -w
- 第6章8节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-小结
本章我们重点环绕处理网络过来的命令的MonkeySourceNetwork这个事件源来阐述学习Monkey是怎样处理MonkeyRunner过来的命令的.以下总结下MonkeyRunner从启动Mon ...
- [BZOJ5305][HAOI2018]苹果树 组合数学
链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...
- PowerShell中和服务相关的命令
New-Service https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-s ...
- Github-flavored Markdown 导出为 PDF
前提条件: 你可以访问Google和它相关的服务 第一步 到Chrome Store安装插件 Markdown Preview Plus 安装以后记得勾选 "允许访问文件网址" 设 ...
- 用json2.js 代替 json.js防止与jQuery的js冲突
用json2.js 代替 json.js防止与jQuery的js冲突 1 s.toJSONString json.js:259 2 Object.toJSONString json.js:158 3 ...
- CentOS7/RedHat7的Apache配置介绍
这里我们介绍yum安装httpd yum install -y httpd ************* [root@100 ~]# systemctl restart httpd [root@100 ...
- Swift学习笔记(15)--下标脚本(Subscripts)
下标脚本可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,使用中类似数组或者字典的用法 1.定义 定义下标脚本使用subscript关键字,语法: s ...