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.hqwc.cn/news/88120.html

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

相关文章

(六)k8s实战-存储管理

一、Volumes 1、HostPath 【使用场景&#xff1a;容器目录 挂载到 主机目录】 【可以持久化到主机上】 将节点上的文件或目录挂载到 Pod 上&#xff0c;此时该目录会变成持久化存储目录&#xff0c;即使 Pod 被删除后重启&#xff0c;也可以重新加载到该目录&#xff0c;该目…

一款轻量级开发者工具,提高开发效率

Devkits Devkits 是一款轻量级桌面端应用&#xff0c;提供了一系列开发者工具&#xff0c;提高开发效率。 离线。类似的在线工具已经不少了&#xff0c;但是大多数都是在线的&#xff0c;网络不好的时候就很难用了。Devkits 提供了离线使用的功能&#xff0c;可以在没有网络的…

自动化测试工具Selenium的语法续.

OK&#xff0c;那么上篇博客我们介绍了如何搭建基于Javaselenium的环境&#xff0c;并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例&#xff0c;那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法&#xff0c;感谢关注&#xff0c;期待三连~ 目…

新KG视点 | Jeff Pan、陈矫彦等——大语言模型与知识图谱的机遇与挑战

OpenKG 大模型专辑 导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力&#xff0c;知识图谱则丰富了表示知识的方式&#xff0c;两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下&#xff0c;OpenKG组织…

移动端h5项目的兼容和适配问题

解决兼容性问题的关键在于对移动端产品的生存环境进行梳理&#xff0c;在此基础之上制定应对策略。 所谓生存环境主要分为三个维度&#xff1a; 硬件环境&#xff0c;细分为品牌和机型&#xff0c;决定了屏幕大小、性能等硬件限制 操作系统&#xff0c;比如iOS6和iOS7&#xf…

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

第101题 可用于多种路由协议,由 ​​if-match​​​和 ​​apply​​子句组成的路由选择工具是 A、​​route-policy​​ B、​​IP-Prefix​​ C、​​commnityfilter​​ D、​​as-path-filter​​ 答案&#xff1a;A 解析&#xff1a; Route-policy&#xff08;路由策…

理虚实一体化全栈全场景云计算应用实训室解决方案

一、 云计算应用统概述 云计算应用系统是指基于云计算技术构建的应用系统&#xff0c;它将软件、数据、计算和存储资源部署在云服务器上&#xff0c;通过网络根据应用按照一定策略为用户提供相关服务。云计算应用系统广泛应用于各个领域&#xff0c;包括但不限于金融、教育、政…

Android Gradle 同步优化

作者&#xff1a;究极逮虾户 很多人听到方法论三个字&#xff0c;就觉得我要开始pua&#xff0c;说我阿里味&#xff0c;但是我觉得这个查问题的方式可能会对大家有点帮助。 很多人都会有这样的困扰&#xff0c;给你的一个工作内容是一个你完全陌生的东西&#xff0c;第一选择…

vue中解决ajax跨域问题(no “access-control-allow-origin”)

文章目录 跨域报错信息产生原因举例解决方法方式一优缺点方式二优缺点 跨域报错信息 产生原因 跨域是是因为浏览器的同源策略限制&#xff0c;是浏览器的一种安全机制&#xff0c;服务端之间是不存在跨域的。 所谓同源指的是两个页面具有相同的协议、主机和端口&#xff0c;三…

【Qt学习】05:自定义封装界面类

OVERVIEW 自定义封装界面类1.QListWidget2.QTreeWidget3.QTableWidget4.StackedWidget5.Others6.自定义封装界面类-显示效果&#xff08;1&#xff09;添加设计师界面类&#xff08;2&#xff09;在ui中设计自定义界面&#xff08;3&#xff09;在需要使用的界面中添加&#xf…

深入分析负载均衡情景

本文出现的内核代码来自Linux5.4.28&#xff0c;为了减少篇幅&#xff0c;我们尽量不引用代码&#xff0c;如果有兴趣&#xff0c;读者可以配合代码阅读本文。 一、有几种负载均衡的方式&#xff1f; 整个Linux的负载均衡器有下面的几个类型&#xff1a; 实际上内核的负载均衡…

激活潜能:探索职场中的自我效能感之道

引言&#xff1a;自我效能感的定义与重要性 自我效能感&#xff0c;简而言之&#xff0c;是个体对自己能够成功完成某项任务的信心。这种信心不仅影响我们的思考方式和情感&#xff0c;还影响我们的行为和动机。在职场中&#xff0c;高自我效能感的人往往更有动力&#xff0c;…