压力测试截图:

云端

  • 定义管道缓存区大小,最多连接数量(线程个数),当前线程个数,管道名字

     //缓冲区大小
    #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多管道云端,客户端通信的更多相关文章

  1. C#中使用命名管道进行进程通信的实例

    原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用 ...

  2. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  3. JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

    OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...

  4. C#使用Socket实现一个socket服务器与多个socket客户端通信

    在分布式调度系统中,如果要实现调度服务器与多台计算节点服务器之间通信,采用socket来实现是一种实现方式,当然我们也可以通过数据存储任务,子节点来完成任务,但是往往使用数据作为任务存储都需要定制开发 ...

  5. Python_服务器与多客户端通信、UDP协议、pycharm打印带颜色输出、时间同步的机制

    1.服务器与多客户端通信 import socket # 创建tcp socket的套接字 sk = socket.socket() # bind sk.bind(('127.0.0.1',8080) ...

  6. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  7. 使用CBrother做TCP服务器与C++客户端通信

    使用CBrother脚本做TCP服务器与C++客户端通信 工作中总是会遇到一些对于服务器压力不是特别大,但是代码量比较多,用C++写起来很不方便.对于这种需求,我选择用CBrother脚本做服务器,之 ...

  8. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  9. Java实例练习——基于UDP协议的多客户端通信

    昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...

随机推荐

  1. 仿分词统计的MapReduce 程序。

    HDFS 数据格式 :  举例单条数据:02-26 08:01:56 [qtp512249001-42] INFO  async-statistics - class com.spring.aop.S ...

  2. ArcSDE学习笔记------了解ArcSDE

    刚来公司的时候一直在做地图服务,用的是ArcGIS,然后对地图的操作用的是普通的数据库操作.后来带我的一个同事让我学习一下ArcSDE.那么ArcSDE到底是什么呢?明明所有的操作我用普通数据库也实现 ...

  3. python list的+,+=,append,extend

    面试题之中的一个. def func1(p): p = p + [1] def func2(p): p += [1] p1 = [1,2,3] p2 = [1,2,3] func1(p1) func2 ...

  4. C++刷题——2802: 推断字符串是否为回文

    Description 编敲代码,推断输入的一个字符串是否为回文. 若是则输出"Yes".否则输出"No". 所谓回文是指順读和倒读都是一样的字符串. Inpu ...

  5. how to backup and restore database of SQL Server

    Back up 1,右键选中需要备份的数据库,Tasks-->Backup 2.General中,Destination,先remove掉之前的,然后再Add 需要注意的是,add的文件,必须要 ...

  6. 9.java 操作mongodb插入、读取、修改以及删除基础

    1 package mongodb; import java.net.UnknownHostException; import java.util.ArrayList; import java.uti ...

  7. 洛谷P4093 [HEOI2016/TJOI2016]序列

    题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所有变化的可能性, ...

  8. JS--处理重复元素

    1.Js找出在数组中出现过的元素,即删除重复元素最后只留一个 <script> function findEleOnly(arr){ for(var i=arr.length-1;i> ...

  9. Coderfroces 864 E. Fire(01背包+路径标记)

    E. Fire http://codeforces.com/problemset/problem/864/E Polycarp is in really serious trouble — his h ...

  10. 实现IE下兼容CSS3的圆角效果

    有些CSS3的牛逼的效果在IE下展示不出来是最烦人的啦,在项目中做的圆角效果到了IE下一堆方块....忒尴尬了...,找了个替代解决方案 1.首先下载一个js插件PIE.js百度一搜都是的,我也就不写 ...