压力测试截图:

云端

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

     //缓冲区大小
    #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. 洛谷—— P2419 [USACO08JAN]牛大赛Cow Contest

    https://www.luogu.org/problem/show?pid=2419 题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, convenie ...

  2. 使用spring-loaded开源项目,实现java程序和web应用的热部署

    JDK1.5之后提供了java.lang.instrument.Instrumentation,即java agent机制可以实现类的redefinition和retransform. redefin ...

  3. POJ 1191 记忆化搜索

    (我是不会告诉你我是抄的http://www.cnblogs.com/scau20110726/archive/2013/02/27/2936050.html这个人的) 一开始没有想到要化一下方差的式 ...

  4. leetcode 10 Regular Expression Matching(简单正则表达式匹配)

    最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...

  5. HTTP 各种特性应用(三)

    一. 数据协商 分类: 客户端请求: Accept: Accept:表明 我想要什么样的数据 Accept-Encoding:数据是什么样的编码方式 进行传输.主要限制 服务端怎样进行数据的压缩. A ...

  6. DedeCMS版权信息SQL命令删除

    dedecms织梦系统底部会自动带有官方链接power by dedecms字样,很多新用户想去除官方的链接,底部调用标签为{dede:global.cfg_poweby/},方法很多,但不鼓励大家删 ...

  7. df---显示磁盘分区使用空间

    df命令用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法 df(选项)(参数) 选项 -a或--all:包含全部的文 ...

  8. Swift学习笔记(12)--数组和字典的复制

    Swift中,数组Array和字典Dictionary是用结构来实现的,但是数组与字典和其它结构在进行赋值或者作为参数传递给函数的时候有一些不同. 并且数组和字典的这些操作,又与Foundation中 ...

  9. this对象的理解

    (回答一:) (1).js的this指向是不确定的,也就是说是可以动态改变的.call/apply 就是用于改变this指向的函数,这样设计可以让代码更加灵活,复用性更高 (2).this 一般情况下 ...

  10. 【Henu ACM Round#16 A】 Bear and Game

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 看看什么时候t[i]-t[i-1]>15. 输出t[i-1]+15就好. 不存在这样的i就输出min(t[n]+15,90) ...