ACE之ACE_NonBlocking_Connect_Handler问题分析

问题

ACE_NonBlocking_Connect_Handler在处理异步时存在问题

分析

当connect选择的同步参数为ACE_Synch_Options::USE_REACTOR时,连接超时时间为ACE_Time_Value::zero,在同步发起连接返回的错误码为EWOULDBLOCK时,会发起异步连接nonblocking_connect,事件类型为CONNECT_MASK,事件处理器为ACE_NonBlocking_Connect_HandlerCONNECT_MASK在window平台上select reactor会注册可读,可写,异常,在linux平台下dev poll reactor中注册可读可写
select reactor和dev poll reactor在处理io事件时,处理优先顺序为可写,异常,可读

template <typename SVC_HANDLER, typename PEER_CONNECTOR> int
ACE_Connector<SVC_HANDLER, PEER_CONNECTOR>::connect_i
(SVC_HANDLER *&sh,SVC_HANDLER **sh_copy,const typename PEER_CONNECTOR::PEER_ADDR &remote_addr,const ACE_Synch_Options &synch_options,const typename PEER_CONNECTOR::PEER_ADDR &local_addr,int reuse_addr,int flags,int perms)
{ACE_TRACE ("ACE_Connector<SVC_HANDLER, PEER_CONNECTOR>::connect_i");// If the user hasn't supplied us with a <SVC_HANDLER> we'll use the// factory method to create one.  Otherwise, things will remain as// they are...if (this->make_svc_handler (sh) == -1)return -1;ACE_Time_Value *timeout = 0;int const use_reactor = synch_options[ACE_Synch_Options::USE_REACTOR];if (use_reactor)timeout = const_cast<ACE_Time_Value *> (&ACE_Time_Value::zero);elsetimeout = const_cast<ACE_Time_Value *> (synch_options.time_value ());int result;if (sh_copy == 0)result = this->connect_svc_handler (sh,remote_addr,timeout,local_addr,reuse_addr,flags,perms);elseresult = this->connect_svc_handler (sh,*sh_copy,remote_addr,timeout,local_addr,reuse_addr,flags,perms);// Activate immediately if we are connected.if (result != -1)return this->activate_svc_handler (sh);// Delegate to connection strategy.if (use_reactor && ACE_OS::last_error () == EWOULDBLOCK){// If the connection hasn't completed and we are using// non-blocking semantics then register// ACE_NonBlocking_Connect_Handler with the ACE_Reactor so that// it will call us back when the connection is complete or we// timeout, whichever comes first...if (sh_copy == 0)result = this->nonblocking_connect (sh, synch_options);elseresult = this->nonblocking_connect (*sh_copy, synch_options);// If for some reason the <nonblocking_connect> call failed, then <errno>// will be set to the new error.  If the call succeeds, however,// we need to make sure that <errno> remains set to// <EWOULDBLOCK>.if (result == 0)errno = EWOULDBLOCK;}else{// Save/restore errno.ACE_Errno_Guard error (errno);// Make sure to close down the service handler to avoid handle// leaks.if (sh_copy == 0){if (sh)sh->close (CLOSE_DURING_NEW_CONNECTION);}else if (*sh_copy)(*sh_copy)->close (CLOSE_DURING_NEW_CONNECTION);}return -1;
}template <typename SVC_HANDLER, typename PEER_CONNECTOR> int
ACE_Connector<SVC_HANDLER, PEER_CONNECTOR>::nonblocking_connect
(SVC_HANDLER *sh,const ACE_Synch_Options &synch_options)
{ACE_TRACE ("ACE_Connector<SVC_HANDLER, PEER_CONNECTOR>::nonblocking_connect");// Must have a valid Reactor for non-blocking connects to work.if (this->reactor () == 0)return -1;// Register the pending SVC_HANDLER so that it can be activated// later on when the connection completes.ACE_HANDLE handle = sh->get_handle ();long timer_id = -1;ACE_Time_Value *tv = 0;NBCH *nbch = 0;ACE_NEW_RETURN (nbch,NBCH (*this,sh,-1),-1);ACE_Event_Handler_var safe_nbch (nbch);// Exclusive access to the Reactor.ACE_GUARD_RETURN (ACE_Lock, ace_mon, this->reactor ()->lock (), -1);// Register handle with the reactor for connection events.ACE_Reactor_Mask mask = ACE_Event_Handler::CONNECT_MASK;if (this->reactor ()->register_handler (handle,nbch,mask) == -1)goto reactor_registration_failure;// Add handle to non-blocking handle set.this->non_blocking_handles ().insert (handle);// If we're starting connection under timer control then we need to// schedule a timeout with the ACE_Reactor.tv = const_cast<ACE_Time_Value *> (synch_options.time_value ());if (tv != 0){timer_id =this->reactor ()->schedule_timer (nbch,synch_options.arg (),*tv);if (timer_id == -1)goto timer_registration_failure;// Remember timer id.nbch->timer_id (timer_id);}return 0;// Undo previous actions using the ol' "goto label and fallthru"// trick...timer_registration_failure:// Remove from Reactor.this->reactor ()->remove_handler (handle, mask);// Remove handle from the set of non-blocking handles.this->non_blocking_handles ().remove (handle);/* FALLTHRU */reactor_registration_failure:// Close the svc_handlersh->close (CLOSE_DURING_NEW_CONNECTION);return -1;
}

但是在ACE_NonBlocking_Connect_Handler代码注释中为,handle_input 是处理连接失败, handle_output 是处理连接成功,但是在可写时需要获取套接字的错误码,如果错误码为0,则表示真正的连接成功

/// Called by ACE_Reactor when asynchronous connections fail.virtual int handle_input (ACE_HANDLE);/// Called by ACE_Dev_Poll_Reactor when asynchronous connections fail.virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask);/// Called by ACE_Reactor when asynchronous connections succeed.virtual int handle_output (ACE_HANDLE);/// Called by ACE_Reactor when asynchronous connections suceeds (on/// some platforms only).virtual int handle_exception (ACE_HANDLE fd);

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

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

相关文章

『uniapp』i18n 国际化(保姆级图文)

目录 预览效果项目根目录新建i18n文件夹安装vue-i18n 指定版本main.js 中引入i18n页面展示总结欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新中 预览效果 中文 英文 项目根目录新建i18n文件夹 其中各个语言的json文件

P1967 [NOIP 2013 提高组] 货车运

题目背景 NOIP2013 提高组 D1T3 题目描述 A 国有 n n n 座城市&#xff0c;编号从 1 1 1 到 n n n&#xff0c;城市之间有 m m m 条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。 现在有 q q q 辆货车在运输货物&#xff0c; 司机们想知道每辆车在不…

【软考高项论文】论信息系统项目的沟通管理

摘要 在信息系统项目的实施进程中&#xff0c;沟通管理的重要性不言而喻。有效的沟通不仅能保证项目信息准确传递&#xff0c;还能推动团队协作&#xff0c;提高项目整体效率。本文结合 2024 年 6 月我所参与的信息系统项目&#xff0c;围绕项目沟通管理的过程及项目干系人管理…

浪潮和曙光服务器的ipmi配置教程

配置浪潮SA5212M5服务器 1、启动服务器按DEL按键进入服务器bios 2、选择Server Mgmt菜单中的BMC Network Configuration配置项回车。 3、BMC Network Configuration配置项中的Get BMC Dedicated Parameters选择Manual&#xff08;手动配置&#xff09; 4、BMC Network Configu…

Golang 标准库errors用法

Go语言的标准库中的errors包提供了一些用于创建和操作错误的基本功能。下面是对该包的详细用法说明。 基本用法 创建错误 使用errors.New函数创建一个新的错误对象。errors.New接受一个字符串参数作为错误信息&#xff0c;并返回一个实现了error接口的对象。 package mainimpo…

搭建自己的WEB应用防火墙

搭建自己的WEB应用防火墙 之前给客户搭建的网站服务近期频繁遭受恶意扫描、暴力破解攻击&#xff0c;日志里记录着各种奇葩的请求地址&#xff0c;导致Tomcat线程资源耗尽&#xff0c;最终nginx报504&#xff08;网关超时&#xff09;&#xff0c;在服务器上curl本地请求依然卡…

MySQL:CRUD操作

目录 XML模版一、结果返回集二、查询三、查询详情四、新增4.1 不含逗号4.1 含逗号 五、修改5.1 不含逗号5.2 含逗号 六、删除 XML模版 xml <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3…

智慧园区综合管理平台:提升园区运营效能的核心利器

在数字化浪潮席卷各个领域的当下&#xff0c;智慧园区的建设成为了推动产业升级、提升管理效率和服务质量的关键举措。而综合管理平台作为智慧园区的 “大脑”&#xff0c;整合了园区运营的各类功能&#xff0c;为园区管理者和企业提供了全方位的支持。本文将基于一份智慧园区功…

碰一碰发视频源码搭建,支持OEM

在数字化生活日益普及的今天&#xff0c;便捷的信息传输方式成为用户的迫切需求。“碰一碰发视频” 功能凭借其新颖的交互体验和高效的数据传输特性&#xff0c;在社交分享、文件传输等场景中备受青睐。本文将深入探讨碰一碰发视频源码搭建的定制化开发流程&#xff0c;涵盖核心…

Walrus为数据存储带来可编程性

要点总结 Walrus 是下一代去中心化存储协议&#xff0c;旨在突破传统中心化云存储的局限&#xff0c;如高昂成本、单点故障、审查和隐私风险等&#xff0c;同时相较于其他去中心化存储系统也做出了诸多创新&#xff0c;尤其是在可编程性与性能上的提升。“blob” 即 Binary La…

React:利用计算属性名特点更新表单值

需求&#xff1a;三个input框&#xff0c;在input框输入时候&#xff0c;获取最新值&#xff0c;进行数据更新 思路&#xff1a;name属性的变量设置的和表单的变量一样&#xff0c;方便通过name属性更新值 function TenantManage() {const [formData, setFormData] useState…

【软考高项论文】论信息系统项目的范围管理

摘要 在信息系统项目管理里&#xff0c;范围管理极为关键。有效的范围管理可保障项目按时、按质、按量完成&#xff0c;避免变更带来的混乱与成本超支。本文结合作者参与的一个 2024 年 3 月启动的信息系统项目&#xff0c;详细阐述项目范围管理的过程&#xff0c;包括范围规划…

盖雅工场 2025 香港 SAP NOW 大会深度解析:AI 重构亚太劳动力管理数字化生态

一、前沿技术亮相&#xff1a;AI 驱动人力资源数字化转型全景展示 在 6 月 13 日举办的 2025 香港 SAP NOW 大会上&#xff0c;亚太劳动力管理领军企业盖雅工场&#xff08;GaiaWorks&#xff09;以「AI 劳动力管理」为核心&#xff0c;通过主题演讲与沉浸式展台演示&#xf…

Latent Diffusion中VAE损失函数源码解读及对损失函数的理解

最近因为工作需求&#xff0c;接触了Latent Diffusion中VAE训练的相关代码&#xff0c;其中损失函数是由名为LPIPSWithDiscriminator的类进行计算的&#xff0c;包括像素级别的重建损失&#xff08;rec_loss&#xff09;、感知损失&#xff08;p_loss&#xff09;和基于判别器&…

MIT 6.824学习心得(1) 浅谈分布式系统概论与MapReduce

一个月前机缘巧合&#xff0c;有朋友向我推荐了麻省理工学院非常著名的分布式系统课程MIT 6.824&#xff0c;是由世界五大黑客之一&#xff0c;蠕虫病毒之父Robert Morris教授进行授课。由于我自己也在做基于分布式微服务架构的业务项目&#xff0c;所以对构建分布式系统这个课…

PCL点云库入门(第21讲)——PCL库点云特征之RSD特征描述Radius-based Surface Descriptor(RSD)

一、算法原理 RSD: Radius-based Surface Descriptor由 Marton Zsolt et al. 于 2010 年提出&#xff0c;主要用于 点云中物体的几何形状识别&#xff08;如球形、柱面、平面等&#xff09;&#xff0c;广泛用于机器人抓取、点云分割和物体识别等任务中。 1.1、RSD 特征的核心…

zookeeper Curator(4):分布式锁

文章目录 分布式锁分布式锁的实现zookeeper 分布式锁原理Curator 实现分布式锁API1. InterProcessMutex&#xff08;分布式可重入互斥锁&#xff09;2. InterProcessSemaphoreMutex&#xff08;分布式非可重入互斥锁&#xff09;3. InterProcessReadWriteLock&#xff08;分布式…

设置方法区内存的大小

方法区内存配置 方法区&#xff08;Method Area&#xff09;是JVM内存模型的一部分&#xff0c;用于存储类信息、常量、静态变量等数据。在HotSpot虚拟机中&#xff0c;方法区的具体实现为永久代&#xff08;PermGen&#xff09;或元空间&#xff08;Metaspace&#xff09;&am…

用Flink打造实时数仓:生产环境中的“坑”与“解药”

目录 一、实时数仓的“野心”与“现实” 二、数据采集与接入:别让“源头”卡脖子 2.1 问题1:Kafka数据乱序与延迟 2.2 问题2:MySQL CDC数据同步异常 三、数据处理与计算:别让“算力”成瓶颈 3.1 问题3:多表Join性能低下 3.2 问题4:窗口计算触发延迟 四、状态管理与…

linux 下 Doris 单点部署

目录 1. Doris 下载 2. 环境准备 2.1 Linux 操作系统版本需求 2.2 部署依赖 3. Doris 部署 3.1 修改系统配置 3.1.1 修改系统句柄数 3.1.2 关闭swap分区 3.1.3 修改最大内存映射区域数量 3.2 开放端口 3.3 fe 部署 3.4 be 部署 3.5 be添加到Doris集群 4 验证 4.…