压力测试截图:

云端

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

     //缓冲区大小
    #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. 洛谷 P3152 正整数序列

    P3152 正整数序列 题目描述 kkk制造了一个序列,这个序列里的数全是由正整数构成的.你别认为她的数列很神奇——其实就是1, 2, …, n而已.当然,n是给定的.kkk的同学lzn认为0是一个好 ...

  2. lightoj--1043-- Triangle Partitioning (水题)

    Triangle Partitioning Time Limit: 500MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu S ...

  3. 洛谷P2598 [ZJOI2009]狼和羊的故事

    题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈 ...

  4. 消息推送学习一、原生Socket的使用

    消息推送也是客户端和服务器连接然后进行交互的一种形式,但是不同于HTTP的连接,这种连接需要长时间的进行,当有消息时可以及时推送到客户端.除此之外还有多个用户,可能需要针对其身份进行不同的推送等等要求 ...

  5. ipad无法连接到app store怎么办

    之前入手的air2提示无法连接到app store:你需要首先更新系统到最新的ios版本,去通用设置里面,有个update software, 点击即可,然后才能用apple id 联入,否选择提示连 ...

  6. JAVA使用Gson解析json数据,实例

    封装类Attribute: public class Attribute { private int id; private String name; private int age; public ...

  7. SQL保存XML报错 “XML 分析: 行 1,字符 47,非法的 xml 字符”

    例如: <?xml version="1.0" encoding="utf-8" standalone="yes"?> < ...

  8. Linux桌面词典 星际译王(StarDict)

    星际译王(StarDict)是利用GTK(GIMP TOOLKIT)开发的国际化的.跨平台的自由的桌面字典软件.它并不包含字典档,使用者须自行下载配合使用.它可以运行于多种不同的平台,如Linux, ...

  9. 【Linux端口大全】

    2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发生器 20端口 ...

  10. java实现折半查找

    package althorgrim;/** * 1.必须采用顺序存储结果 * 2.关键字必须有序 * @author hanrk-2734 * */public class TestBinarySe ...