实现并发的管道

管道客户端

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>

#define SIZE 4096
char  pipename[128] = "\\\\.\\Pipe\\cloudpipe";
HANDLE m_pipe = NULL;

int a;
int b;
void run()
{
    time_t ts;
    unsigned int num = time(&ts);
    srand(num);
    a = rand() % 1000;
    b= rand() % 1000;
}

void main()
{
    m_pipe = CreateFileA(pipename, //名称
        GENERIC_WRITE | GENERIC_READ,//读写
        0,//共享属性,1独有
        NULL,//默认安全属性
        OPEN_EXISTING,//打开已经存在的
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if (m_pipe==INVALID_HANDLE_VALUE)
    {
        printf("失败");
        return;
    }
    int nwrite;
    int nread;
    run();
    char winfo[1024] = { 0 };
    sprintf(winfo, "%d %d", a, b);//打印数据
    WriteFile(m_pipe, winfo, strlen(winfo), &nwrite, NULL);//写入
    memset(winfo, 0, sizeof(winfo));//清零
    ReadFile(m_pipe, winfo, 1024, &nread, NULL);//读取
    int  res;
    sscanf(winfo, "%d", &res);
    printf("\n%d+%d=%d", a, b, res);

    system("pause");
}

2.服务端

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>

#define SIZE 4096
#define MAX_CONNECT 128
int  startthreadnum = 10;//一开始有10个线程存在
char  pipename[128] = "\\\\.\\Pipe\\cloudpipe";

typedef struct info
{
    HANDLE hthread;
    HANDLE hpipe;
    HANDLE hevent;

}PIPE_ST;

PIPE_ST  pipeinst[MAX_CONNECT];//128个结构体

DWORD WINAPI severThread(void *lp)
{
    DWORD nread = 0;
    DWORD nwrite = 0;
    DWORD dwbyte = 0;
    char szbuf[SIZE] = { 0 };
    PIPE_ST curpipe = *(PIPE_ST*)lp;//获取当前结构体
    OVERLAPPED overlap = { 0, 0, 0, 0, curpipe.hevent };//初始化一个结构体

    while (1)
    {
        memset(szbuf, 0, sizeof(szbuf));//数据清理
        ConnectNamedPipe(curpipe.hpipe, &overlap);//链接上,信息写入overlap
        WaitForSingleObject(curpipe.hevent, INFINITE);//等待
        //检测IO,如果完成就跳出
        if (!GetOverlappedResult(curpipe.hpipe,&overlap,&dwbyte,TRUE))
        {
            break;
        }
        if (!ReadFile(curpipe.hpipe,szbuf,SIZE,&nread,NULL))
        {
            puts("read fail");
            break;
        }
        int a, b;
        sscanf(szbuf, "%d %d", &a, &b);
        memset(szbuf, 0, sizeof(szbuf));//清零
        sprintf(szbuf, "%d", a + b);
        WriteFile(curpipe.hpipe, szbuf, strlen(szbuf), &nwrite, NULL);//写入

        DisconnectNamedPipe(curpipe.hpipe);//断开

    }
    return 0;

}

void start()
{
    for (int i = 0; i <startthreadnum; i++)
    {

        pipeinst[i].hpipe = CreateNamedPipeA(
            pipename,//管道名称
            PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,//管道读写属性
            PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,//消息模式,读模式,等待模式阻塞
            10,//最大个数
            0,//输出缓冲区大小
            0,//输入缓冲区大小
            1000,//超时,无限等待
            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,0,severThread,&pipeinst[i],0,NULL);

    }
    printf("sever start");

}
void end()
{

}
void main()
{
    start();

    system("pause");

}

3.压力测试

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

void main()
{

    while (1)
    {
        for (int i = 0; i < 10;i++)
        {//system()不能异步,使用shellExecuteA()
            ShellExecuteA(NULL, "open", "C:\\Users\\yincheng01\\Desktop\\code\\pipe\\Debug\\客户端.exe", NULL, NULL, 1);
            Sleep(100);
        }

    }

}
时间: 2024-10-12 23:32:42

实现并发的管道的相关文章

python并发编程(管道,事件,信号量,进程池)

管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pipe def f1(conn): from_zhujincheng = conn.recv() print('子进程') print('来自主进程的消息:',from_zhujincheng) if __name__ == '__main__': conn1,conn2 = Pipe() #创建一个管

python_并发编程——管道和数据共享

1.管道 from multiprocessing import Pipe conn1,conn2 = Pipe() #返回两个值 conn1.send('wdc') #发送 print(conn2.recv()) #接收 conn2.send('yhf') print(conn1.recv()) 结果:~双向通信 2.在进程中传递数据 from multiprocessing import Pipe,Process class Pr1(Process): def __init__(self,c

Oracle管道函数(Pipelined Table Function)介绍

一 概述: 1.管道函数即是能够返回行集合(能够使嵌套表nested table 或数组 varray)的函数,我们能够像查询物理表一样查询它或者将其 赋值给集合变量. 2.管道函数为并行运行,在普通的函数中使用dbms_output输出的信息,须要在server运行完整个函数后一次性的返回给client.假设须要在client 实时的输出函数运行过程中的一些信息,在oracle9i以后能够使用管道函数(pipeline function). 3.keywordPIPELINED表明这是一个or

python 管道 事件 信号量 进程池(map/同步/异步)回调函数

####################总结######################## 管道:是进程间通信的第二种方式,但是不推荐使用,因为管道会导致数据不安全的情况出现 事件:当我运行主进程的时候 需要子执行某个进程后 需要的返回值时 可以使用 信号量:互斥锁同时只允许一个线程更改数据,而信号量Semaphore是同时允许一定数量的线程更改数据 . 内部维护了一个计数器,acquire-1,release+1,为0的时候,其他的进程都要在acquire之前等待 进程池:  进程的创建和销

Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?

Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09|  分类: JAVA |  标签:java  |举报|字号 订阅 下面比较一下两者的语法区别:1.抽象类可以有构造方法,接口中不能有构造方法.2.抽象类中可以有普通成员变量,接口中没有普通成员变量3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法.4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclips

awk语法

awk是一个非常棒的数字处理工具.相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理.运行效率高,而且代码简单,对格式化的文本处理能力超强.先来一个例子: 文件a,统计文件a的第一列中是浮点数的行的浮点数的平均值.用awk来实现只需要一句话就可以搞定 $cat a 1.021 33 1#.ll 44 2.53 6 ss 7 awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+\.[0-9]*/){total += $1; le

AWK详细用法

awk非常的优秀,运行效率高,而且代码简单,对格式化的文本处理能力超强.基本上grep和sed能干的活awk全部都能干,而且干得更好. 先来一个很爽的例子:文件a,统计文件a的第一列中是浮点数的行的浮点数的平均值.用awk来实现只需要一句话就可以搞定(当然,这个东东用python也可以很轻松的实现,只是无论如何都得新建一个文件:别妄想用bash shell来做,那可是浮点数!!!)$cat a1.021 331#.ll   442.53 6ss    7awk 'BEGIN{total = 0;

Go首页文档和下载 Google的编程语言

Go是Google开发的一种编译型,并发型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,,稍后Ian Lance Taylor, Russ Cox加入项目中.Go语言是基于Inferno操作系统所开发的.Go语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后追加Windows系统下的实现. Go语言的语法接近C语言,但是对

Android 原生应用开发得到Go语言支持

今天的主要内容为Android 原生应用开发得到Go 语言支持,那么我们首先简单看下GO是什么呢? Go是Google开发的一种编译型,並發型,并具有垃圾回收功能的编程语言. Google工程师和独立开发人员提出了几份不同的提案,旨在让Go语言支持开发原生的Android应用.这项工作无法让Go语言编写的应用使用Android NDK的全部接口,但有可能使用其中的一个子集. David Crawshaw是Google的工程师,他写了一份提案,旨在让Go语言部分支持编写Android应用.根据他的