ACE_Proactor

服务端代码:

#include "stdafx.h"
#include <iostream>
#include "ace/Message_Queue.h"
#include "ace/Asynch_IO.h"
#include "ace/OS.h"
#include "ace/Proactor.h"
#include "ace/Asynch_Acceptor.h"
using namespace  std;
class HA_Proactive_Service :public ACE_Service_Handler
{
public:
    ~HA_Proactive_Service()
    {
        if (this->handle() != ACE_INVALID_HANDLE)
        {
            //ACE_OS:closesocket();
        }
    }
    virtual void open(ACE_HANDLE h, ACE_Message_Block&)
    {
        this->handle(h);
        if (this->reader_.open(*this) != 0 || this->writer_.open(*this) != 0)
        {
            delete this;
            return;
        }
        ACE_Message_Block* mb;
        ACE_NEW_NORETURN(mb, ACE_Message_Block(1024));
        if (this->reader_.read(*mb, mb->space()) != 0)
        {
            printf("read fail");
            mb->release();
            delete this;
            return;
        }
    }
    virtual void handle_read_stream(const  ACE_Asynch_Read_Stream::Result & result)
    {
            ACE_Message_Block& mb = result.message_block();
            if (!result.success() || result.bytes_transferred() == 0)
            {
                mb.release();
                delete this;
            }
            else
            {
                mb.copy("");    //为字符串添加结束标记'/0'   
                ACE_OS::printf("rev:%s\n", mb.rd_ptr());
                if ((this->writer_.write(mb, mb.length())) != 0)
                {
                    printf("write fail");
                    mb.release();
                }
                else
                {
                    printf("Before ACE_NEW_NORETURN\n");
                    ACE_Message_Block* new_mb;
                    ACE_NEW_NORETURN(new_mb, ACE_Message_Block(1024));
                    this->reader_.read(*new_mb, new_mb->space());
                }
            }
            return;
    }
    virtual void handle_write_stream(const ACE_Asynch_Write_Stream::Result & result)
        {
            printf("Enter handle_write_stream\n");
            result.message_block().release();
            return;
        }
    

    private:
        ACE_Asynch_Read_Stream reader_;
        ACE_Asynch_Write_Stream writer_;
};

int main(int argc,char *argv[])
{
    printf("Enter main\n");
    int port = 3000;
    ACE_Asynch_Acceptor<HA_Proactive_Service>acceptor;
    if (acceptor.open(ACE_INET_Addr(port)) == -1)
    return -1;
    while (true)
        ACE_Proactor::instance()->handle_events();
    return 0;
}

客户端代码:

#include "stdafx.h"
#include <iostream>
#include "ace/Message_Queue.h"
#include "ace/Asynch_IO.h"
#include "ace/OS.h"
#include "ace/Proactor.h"
#include "ace/Asynch_Acceptor.h"
#include "ace/Asynch_Connector.h"
using namespace std;
class HA_Proactive_Service :public ACE_Service_Handler
{
public:
    ~HA_Proactive_Service()
    {
        if (this->handle() != ACE_INVALID_HANDLE)
        {
            //ACE_OS:closesocket();
        }
    }
    virtual void open(ACE_HANDLE h, ACE_Message_Block&)
    {
        this->handle(h);
        if (this->writer_.open(*this) != 0)
        {
            delete this;
            return;
        }
        printf("connected\n");
        for(int i = 0; i < 10; i++)
        {
            printf("i is %d\n", i);
            ACE_OS::sleep(1);
            time_t now = ACE_OS::gettimeofday().sec();
            char* time = ctime(&now);
            ACE_Message_Block* mb = new ACE_Message_Block(100);
            mb->copy(time);
            if (this->writer_.write(*mb,mb->length()) != 0)
            {
                printf("Begin write fail\n");
                delete this; 
                return;
            }
        }
        return;
    }
    virtual void  handle_write_dgram(const  ACE_Asynch_Read_Stream::Result& result)
    //virtual void handle_write_stream(const  ACE_Asynch_Read_Stream::Result& result)
    {
        printf("Enter  handle_write_dgram");
        ACE_Message_Block& mb = result.message_block();
        mb.release();
        return;
    }

private:
    ACE_Asynch_Write_Stream writer_;
    ACE_Asynch_Read_Stream reader_;
};

int main(int argc, char* argv[])
{

    ACE_INET_Addr addr(3000, "192.168.31.235");
    HA_Proactive_Service* Client = new HA_Proactive_Service();
    ACE_Asynch_Connector<HA_Proactive_Service>connector;
    connector.open();
    if (connector.connect(addr) == -1)
    {
        return -1;
    }
    while (true)
    {
        ACE_Proactor::instance()->handle_events();
    }
    return 0;
}

服务端打印:

客户端打印:

1)ACE_Service_Handler 是框架提供的接口,而Open,handle_read_stream,handle_write_stream就是接口的模版函数。

2)流操作和处理函数都使用了同一个类:ACE_Asynch_Read_Stream类,对于UDP流,只要使用ACE_Asynch_Read_Dgram类即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/110510.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络综合布线专业技能人才培养方案

一、网络综合布线专业技能人才培养方案概述 网络综合布线专业技能人才培养方案旨在培养具备综合布线系统设计、安装与维护的全面技能和知识的专业人才。以下是一个概述&#xff1a; 培养目标&#xff1a;培养具备综合布线系统的理论基础和实践操作技能的专业人才&#xff0c;能…

MySQL中的free链表,flush链表,LRU链表

一、free链表 1、概述 free链表是一个双向链表数据结构&#xff0c;这个free链表里&#xff0c;每个节点就是一个空闲的缓存页的描述数据块的地址&#xff0c;也就是说&#xff0c;只要你一个缓存页是空闲的&#xff0c;那么他的描述数据块就会被放入这个free链表中。 刚开始数…

Java 体系性能优化工具

Java 体系性能优化 目录概述需求&#xff1a; 设计思路实现思路分析1.oom 异常来说&#xff1a;2.visualvm3.Arthas4.JProfiler &#xff08;全面&#xff09;5.jmeter 特有 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect…

LeetCode第16~20题解

CONTENTS LeetCode 16. 最接近的三数之和&#xff08;中等&#xff09;LeetCode 17. 电话号码的字母组合&#xff08;中等&#xff09;LeetCode 18. 四数之和&#xff08;中等&#xff09; LeetCode 16. 最接近的三数之和&#xff08;中等&#xff09; 【题目描述】 给你一个…

vmware整理

一 部署ESXi 主机与vCenter(VCSA) 实验拓扑描述 实验部分 ESXi 安装 官方下载地址&#xff1a;www.vmware.com 下拉找到vSphere免费版本下载 登录后点击查看我的评估获取自己能下载的版本 VCSA的安装&#xff1a; vCenter&#xff08;VCSA&#xff09;部署 理论描述 虚拟化…

前端:html实现页面切换、顶部标签栏,类似于浏览器的顶部标签栏(完整版)

效果 代码 <!DOCTYPE html> <html><head><style>/* 左侧超链接列表 */.link {display: block;padding: 8px;background-color: #f2f2f2;cursor: pointer;}/* 顶部标签栏 */#tabsContainer {width:98%;display: flex;align-items: center;overflow-x: …

MybatisPlus-插件篇

文章目录 一、前言二、插件1、分页插件2.1.1、引入依赖2.1.1、配置分页插件2.1.3、使用分页方法 2、乐观锁插件2.1、引入依赖2.2、添加版本字段2.3、配置乐观锁插件2.4、执行更新操作 三、总结 一、前言 本文将详细介绍mybatisplus中常用插件的使用。 二、插件 1、分页插件 …

stm32之DS18B20

DS18B20与stm32之间也是通过单总线进行数据的传输的。单总线协议在DHT11中已经介绍过。虽说这两者外设都是单总线&#xff0c;但时序电路却很不一样&#xff0c;DS18B20是更为麻烦一点的。 DS18B20 举例&#xff08;原码补码反码转换_原码反码补码转换_王小小鸭的博客-CSDN博客…

归并排序(Java 实例代码)

目录 归并排序 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 MergeSort.java 文件代码&#xff1a; 归并排序 一、概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分…

迅为RK3588开发板Android12 设置系统默认不锁屏

修改 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 文件&#xff0c;修改为如下 所示&#xff1a; - <bool name"def_lockscreen_disabled">false</bool> <bool name"def_lockscreen_disabled">true</bool&…

Django(5)-视图函数和模板渲染

Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」 在我们的投票应用中&#xff0c;我们需要下列几个视图&#xff1a; 问题索引页——展示最近的几个投票问题。 问题详情页——展示某个投票的问题和不带结果的选项列表。 问题结果页——展示某个投票的结果。 投…

AutoRunner自动化测试工具新版本智能识别算法之视觉识别

泽众AutoRunner&#xff08;简称AR&#xff09;是国内专业的支持C/S、B/S各种技术框架的、基于组件识别的自动化测试工具&#xff0c;实现7*24小时的自动化回归测试和功能测试&#xff0c;让测试更智能。 视觉识别是一种通过计算机技术对图像或视频进行分析和理解的方法。这种算…

短视频矩阵系统接口部署技术搭建

前言 短视频矩阵系统开发涉及到多个领域的技术&#xff0c;包括视频编解码技术、大数据处理技术、音视频传输技术、电子商务及支付技术等。因此&#xff0c;短视频矩阵系统开发人员需要具备扎实的计算机基础知识、出色的编程能力、熟练掌握多种开发工具和框架&#xff0c;并掌握…

win10+wsl2+Ubuntu20.2+Pycharm+WSL解释器

目的&#xff1a;创建一个ubuntu系统下的python解释器&#xff0c;作为win平台下的pycharm的解释器。 这样做的好处是可以直接在win系统里操作文件&#xff0c;相比于linux方便一点&#xff0c;而且也不用对wsl的子系统进行迁移。 一、安装前准备 1. 设置-Windows更新-window…

【大数据】Linkis:打通上层应用与底层计算引擎的数据中间件

Linkis&#xff1a;打通上层应用与底层计算引擎的数据中间件 1.引言2.背景3.设计初衷4.技术架构5.业务架构6.处理流程7.如何支撑高并发8.用户级隔离度和调度时效性9.总结 Linkis 是微众银行开源的一款 数据中间件&#xff0c;用于解决前台各种工具、应用&#xff0c;和后台各种…

华为数通方向HCIP-DataCom H12-821题库(单选题:81-100)

第81题 某公司新购入一台网络设备,作为网络管理员,初次配置该设备通常通过什么方式? A、FTP B、Telnet C、SNMP D、Console 口登录 答案: D 解析&#xff1a; 通常情况下&#xff0c;初次配置网络设备会通过Console口登录的方式进行。Console口是一种串口接口&#xff0c…

自动化PLC工程师能否转到c#上位机开发?

成功从自动化PLC工程师转向C#上位机开发的经历可能因人而异&#xff0c;以下是一些分享的思路和建议&#xff1a;扩展编程技能&#xff1a;学习C#语言和相关的开发工具和框架&#xff0c;掌握语言的基础知识和常用的编程技巧。可以通过在线教程、培训课程、书籍等途径进行学习&…

C++ 多线程编程

C 多线程编程 点击获取更多的C学习笔记 1. 线程库的基本使用 创建线程 要创建线程&#xff0c;我们需要一个可调用的函数或函数对象&#xff0c;作为线程的入口点。在C11中&#xff0c;我们可以使用函数指针、函数对象或lambda表达式来实现。创建线程的基本语法如下&#x…

java.8 - java -overrideoverload 重写和重载

重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不…

如何判断一个java对象还活着

引用计数算法 引用计数器的算法是这样的&#xff1a;在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 缺点&#x…