linux下异步RPC的阶段性总结-非阻塞SOCKET客户端

2023-11-12



  1. 尽可能使用非阻塞socket

    int flags, s;
        flags = fcntl (fd, F_GETFL, 0);  
          if (flags == -1){  
              close(fd);
              return -1;  
        }  
      
          flags |= O_NONBLOCK;  
          s = fcntl (fd, F_SETFL, flags);  
          if (s == -1){  
              close(fd);
              return -1;  
        }  

  2. 使用效率高效的epoll机制获取多个socket上的IN/OUT事件

  3. 非阻塞socket连接服务端时,不一定立即连接得上服务器

    通过判断connect函数的返回值和错误号做进一步跟踪

    int ret = ::connect(this->fd, (struct sockaddr*)&(server_addr), sizeof(server_addr));
                if(ret == 0){
                    this->on_connected();
                }else if(ret < 0 && errno != EINPROGRESS){
                    //error
                }else{
                    on_connecting();
                }

    1. IN/OUT事件时如果是connecting需要判断socket状态,socket reset发生时也会产生事件,然后才进入有效的读写

      if(this->connect_status == 1){//connecting
              int status = 0;
              socklen_t slen;
              if(getsockopt(this->fd, SOL_SOCKET, SO_ERROR, (void*)&status, &slen) < 0){
                  this->on_epollhup();
                  return;
              }
              if(status != 0){
                  this->on_epollhup();
                  return;
              }
             
              on_connected();
          }

  4. 读写发生错误时,通过错误码判断是错误还是数据读完或者缓冲区满了,发生错误则按socket断开处理

    错误代码包括:SIGPIP, EAGAIN 等, EAGAIN表示读完或者缓冲区满,等待下一次事件处理读或者写

  5. 为了达到更高的性能,epoll使用EPOLLET(边沿触发)机制,但是如果事件发生时,无数据可写时,下一次有数据时

    则不会发生OUT事件,因此可以记录一个写空转标识write_nil_loop,epoll_wait事件之前判断是否有数据发送并且发生write_nil_loop,如果有,则重新登记epoll事件

                if(worker->is_write_nil_loop() && (events & EPOLLOUT)){
                        epoll->remove(worker);
                        epoll->add(worker, events);
                    }else if(worker->get_events_mask() != events){
                        epoll->modify(worker, events);
                    }

       同时,读取数据时,尽可能将数据读完,直到recv返回值-1,errno== EAGAIN,其他错误按照出错处理



FROM:  http://my.oschina.net/aruan/blog/509896?p={{currentPage-1}}

  1. 尽可能使用非阻塞socket

    int flags, s;
        flags = fcntl (fd, F_GETFL, 0);  
          if (flags == -1){  
              close(fd);
              return -1;  
        }  
      
          flags |= O_NONBLOCK;  
          s = fcntl (fd, F_SETFL, flags);  
          if (s == -1){  
              close(fd);
              return -1;  
        }  

  2. 使用效率高效的epoll机制获取多个socket上的IN/OUT事件

  3. 非阻塞socket连接服务端时,不一定立即连接得上服务器

    通过判断connect函数的返回值和错误号做进一步跟踪

    int ret = ::connect(this->fd, (struct sockaddr*)&(server_addr), sizeof(server_addr));
                if(ret == 0){
                    this->on_connected();
                }else if(ret < 0 && errno != EINPROGRESS){
                    //error
                }else{
                    on_connecting();
                }

    1. IN/OUT事件时如果是connecting需要判断socket状态,socket reset发生时也会产生事件,然后才进入有效的读写

      if(this->connect_status == 1){//connecting
              int status = 0;
              socklen_t slen;
              if(getsockopt(this->fd, SOL_SOCKET, SO_ERROR, (void*)&status, &slen) < 0){
                  this->on_epollhup();
                  return;
              }
              if(status != 0){
                  this->on_epollhup();
                  return;
              }
             
              on_connected();
          }

  4. 读写发生错误时,通过错误码判断是错误还是数据读完或者缓冲区满了,发生错误则按socket断开处理

    错误代码包括:SIGPIP, EAGAIN 等, EAGAIN表示读完或者缓冲区满,等待下一次事件处理读或者写

  5. 为了达到更高的性能,epoll使用EPOLLET(边沿触发)机制,但是如果事件发生时,无数据可写时,下一次有数据时

    则不会发生OUT事件,因此可以记录一个写空转标识write_nil_loop,epoll_wait事件之前判断是否有数据发送并且发生write_nil_loop,如果有,则重新登记epoll事件

                if(worker->is_write_nil_loop() && (events & EPOLLOUT)){
                        epoll->remove(worker);
                        epoll->add(worker, events);
                    }else if(worker->get_events_mask() != events){
                        epoll->modify(worker, events);
                    }

       同时,读取数据时,尽可能将数据读完,直到recv返回值-1,errno== EAGAIN,其他错误按照出错处理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下异步RPC的阶段性总结-非阻塞SOCKET客户端 的相关文章

  • linux AIO (异步IO) 那点事儿

    在高性能的服务器编程中 IO 模型理所当然的是重中之重 需要谨慎选型的 对于网络套接字 我们可以采用epoll 的方式来轮询 尽管epoll也有一些缺陷 但总体来说还是很高效的 尤其来大量套接字的场景下 但对于Regular File 来说
  • ipv6 socket bind 失败 - accept_dad

    file proc sys net ipv6 conf interface accept dad variable net ipv6 conf interface accept dad Official reference Whether
  • 网络层:IP协议

    本博文分享的是网络层的IP协议 从IP协议的基本概念 协议格式开始分析并分享出来 IP协议的基本概念 不同于讨论TCP UDP时只讨论通信主机之间的关系 在讨论IP协议中 会加上主机之间的网络来一起进行讨论分析 主机 一般配有IP地址 路由
  • C++在线五子棋对战(网页版)项目:websocket协议

    目标 认识理解websocket协议 websocket切换过程和websocket协议格式 认识和学会使用websocketpp库常用接口 了解websocketpp库搭建服务器流程 认识和学会使用websocketpp库bin接口 最后
  • 使用sersync实现数据实时同步

    使用sersync实现数据实时同步 sersync诞生过程 部署前提 配置rsync服务端 部署sersync 配置sersync的path变量 修改sersync配置文件 sersync常用参数 使用服务文件实现开机自启动 实时同步服务d
  • webbench剖析

    webbench 其为linux上一款web性能压力测试工具 它最多可以模拟3万个并发连接数来测试服务器压力 其原理为fork多个子进程 每个子进程都循环做web访问测试 子进程将访问的结果通过管道告诉父进程 父进程做最终结果统计 其主要原
  • 【Linux网络(C++)】——网络套接字(TCP/UDP编程模型)多进程,多线程,线程池服务器开发(画图解析)

    目录 一 套接字基本概念 IP地址 TCP和UDP协议 端口号 端口号vs 进程pid 网络字节序 本地字节序转换成网络字节序 网络字节序转换为本地字节序 二 套接字的基本操作 socket的创建 域 domain 类型 type 协议 P
  • linux 网络编程---->多路复用:select实例!

    好吧 我承认找了好久 网上都没有像样的完整的实例 然后自己参照书自己写一个吧 gt server 端代码 gt server c include
  • socket阻塞与非阻塞,同步与异步、I/O模型

    socket阻塞与非阻塞 同步与异步 作者 huangguisu 1 概念理解 在进行网络编程时 我们常常见到同步 Sync 异步 Async 阻塞 Block 非阻塞 Unblock 四种调用方式 同步 所谓同步 就是在发出一个功能调用时
  • 基于tcpdump实例讲解TCP/IP协议

    前言 虽然网络编程的socket大家很多都会操作 但是很多还是不熟悉socket编程中 底层TCP IP协议的交互过程 本文会一个简单的客户端程序和服务端程序的交互过程 使用tcpdump抓包 实例讲解客户端和服务端的TCP IP交互细节
  • 基于epoll的聊天室程序

    epoll相对于poll和select这两个多路复用的I O模型更加的高效 epoll的函数很简单 麻烦的地方在于水平出发和边沿触发 用张图来说明下 ET 边沿 只是在状态反转时触发 比如从不可读到可读 而LT 水平 就是如果可读 就会一直
  • linux系统PXE自动装机无人值守

    PXE高效批量网络装机 PXE服务允许客户机通过网络从远程服务器下载引导镜像 并安装文件或整个操作系统 必须满足的前提条件 客户机的网卡支持PXE协议 且主板支持网络引导 网络中有一台DHCP服务器为客户机分配地址 指定引导文件位置 服务器
  • Linux网络和安全:配置、远程访问与防御指南

    文章目录 Linux 网络和安全 引言 网络配置 IP地址配置 配置网络接口 防火墙设置 安全性加强 Linux网络配置及端口管理 网络配置命令 端口管理 防火墙和安全性设置 防火墙管理工具 安全性设置 Linux远程访问技术 SSH和VP
  • Linux网络编程一步一步学 - 目录(汇总)zhuan

    非常好的关于Linux网络编程的文章 我也是无意中在别人的博客里发现的 在网上搜了一下 这类的文章总共还有很多篇 最后我找到了原作者的姓名 周立发 以及作者的博客空间 本人坚决支持原创 在此将其文章进行了汇总 并且空间首页加入了他的博客链接
  • TCP通信流程解析

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用
  • 【网络】——UDP复习笔记

    目录 1 UDP报文结构 2 UDP缓冲区 3 UDP特点 4 课后题 1 UDP报文结构 2 UDP缓冲区 UDP没有真正意义上的发送缓冲区 应用层调用sendto 函数直接将数据应用层的数据拷贝给传输层 传输层再构建UDP报头 然后再交
  • 高并发的epoll+多线程

    epoll是linux下高并发服务器的完美方案 因为是基于事件触发的 所以比select快的不只是一个数量级 单线程epoll 触发量可达到15000 但是加上业务后 因为大多数业务都与数据库打交道 所以就会存在阻塞的情况 这个时候就必须用
  • linux非阻塞socket教程

    本文并非解释什么是非阻塞socket 也不是介绍socket API的用法 取而代替的是让你感受实际工作中的代码编写 虽然很简陋 但你可以通过man手册与其它资源非富你的代码 请注意本教程所说的主题 如果细说 内容可以达到一本书内容 你会发
  • 【网络自定向下学习】——TCP报文段的详细解析

    个人主页 努力学习的少年 版权 本文由 努力学习的少年 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 目录 一 Tcp报文段的结构 二 首部长度 三 窗口大小 四 序列号和确认序
  • 超级详细Tcpdump 的用法

    1 抓取回环网口的包 tcpdump i lo 2 防止包截断 tcpdump s0 3 以数字显示主机及端口 tcpdump n 第一种是关于类型的关键字 主要包括host net port 例如 host 210 27 48 2 指明

随机推荐

  • Bugku-game WP 一道有意思的题

    开启环境后 进入到了一个页面内的游戏界面 在页面中没有发现什么提示 开始游戏后 发现游戏内玩家通过玩游戏可以获得一定的积分 那么试想是否可以通过将积分更改得很大得做法来通关获得flag 查看源码 众所周知 分数一般会取名为score 那么在
  • Java Web应用开发常用网上资源

    前言 为了方便学习 下面为大家推荐一些学习Java Web开发的相关资源 使用这些资源 可以帮助你找到精通Java Web应用开发的捷径 常用资源下载网 在开发Java Web应用程序时 通常需要到相关资源的官方网站下载一些资源 下面将给出
  • jenkins如何同一jar包部署到多台服务器

    文章目录 安装插件 配置ssh服务 构建完成后执行 没有部署过可以跟这个下面的步骤先部署一遍 我这篇主要讲jenkins同一jar包部署到多台服务器 Jenkins 部署Springboot项目https blog csdn net qq
  • 步进电机五根线怎么接_软启动怎么接电机?软启动电机实物接线图

    电工学习网 www diangon com 关注电工学习网官方微信公众号 电工电气学习 收获更多经验知识 50万 维修电工关注的微信平台 技术分享 学习交流 资料下载 常用的五种电机软启动器 接线图 一 CMC L系列数码型电机软启动器是一
  • 学习笔记 JavaScript ES6 Proxy

    学习内容 代理 常用拦截方法 ES 5当中实现拦截的方法 let obj let newValue Object defineProperty obj name get return newValue set val console log
  • 安卓的多选框CheckBox

    选中选项中的内容并且点击按键 就会在顶头的title显示出来 1 做好布局控件 2 绑定控件 3 button设置了监听 一旦点击了button就跳到checkbox里面去执行 4 checkbox需要if语句进行判断 选中就显示 XML文
  • 你真的知道如何在 ESXi 上安装 Linux 吗?

    1 分区4K对齐以获得最佳存储性能 如果分区没有4K对齐 这对单个磁盘来说不是什么大问题 但对于共享存储来说 共享存储中的一个LUN实际上是跨越多个不同的磁盘条带化的 所以虚拟机操作系统的一次读或写操作会导致存储阵列上的I O翻倍 未对齐的
  • 设计模式(1) 创建型模式和抽象工厂(Abstract Factory)

    问题聚焦 分别用一句话概括这节的几个知识点 什么是创建型模式 抽象了实例化过程 创建型模式有哪些 抽象工厂 工厂方法 原型模式 生成器模式 什么是抽象工厂 AbstractFactory 模式 与接口交互 获得一系列相关或互相依赖的对象实例
  • 【ESP32】VSCode添加驱动文件

    1 创建文件夹并添加驱动文件 2 修改main文件夹下的 CMakeLists txt
  • 扑克牌游戏中, 使用python实现一个查找顺子的算法

    在扑克牌游戏中 需要实现一个查找顺子的算法 连续的数字即为顺子 随机发N张牌 从中挑出最长的顺子 并返回其长度 如果没有顺子返回0 现在手上的牌为 12 3 4 10 6 5 6 8 11 9 11 11 9 12 1 1 去重 排序 m
  • python实现读取目录文件夹下的所有指定格式文件路径

    import os def get img file file name imagelist for parent dirnames filenames in os walk file name for filename in filena
  • lucene 学习笔记之一亢龙有悔

    一 Lucene的介绍 Lucene是一个全文检索的框架 apache组织提供了一个用Java实现的全文搜索引擎的开源项目 其功能非常的强大 api非常简单 并且有了全文检索的功能支持可以非常方便的实现根据关键字来搜索整个应用系统的内容 大
  • 阿里巴巴java开发规范

    一 编码规约 1 强制 代码中的命名均不能以下划线或美元符号开始 也不能以下划线或美元符号结束 反例 name name Object name name Object 2 强制 代码中的命名严禁使用拼音与英文混合的方式 更不允许直接使用中
  • 基于canvas的前端图片压缩

    common canvas图片压缩 param Object opt 配置参数 param Function cbk 回调函数 return Void example var opt type 1 为1为预览 建议不为1或后期进行改进 fi
  • Windows系统中Mysql目录迁移

    1 为什么迁移 最近发现我笔记本电脑C盘的内存空间有点儿吃紧 有以下目录可以直接清理 1 电脑运行产生的临时文件目录 C Windows Temp 2 Windows系统日常更新的数据包和安装包目录 一般可以释放10G左右空间 C Wind
  • package-lock.json 作用

    参照 https www cnblogs com honkerzh p 16767566 html
  • GMS程序调试指南

    代码获得处 https github com JiawangBian GMS Feature Matcher 作者交流处 https jwbian net gms comment 55 可以查看出现同样的问题 也有作者声明论文中表达错误的地
  • 【瑞吉外卖day06】

    1 手机验证码登录 1 1 需求分析 客户输入手机号码 获取验证码后 输入后能成功登录 1 2 用户登录 首先修改拦截器 将手机端的发送短信和登录请求加到过滤器的放行请求中 然后在拦截器中加入这些 利用session判断用户是否登录 用户如
  • 枚举与数组

    枚举与数组的区别 枚举是标签 定死的 数组是容器 存放数据 枚举是值类型 数组是引用类型 枚举是常量的集合 数组是变量的集合 枚举对象在任一时刻只能有一个常量值 数组对象在任一时刻可以有多个值 枚举 在数学和计算机科学理论中 一个集的枚举是
  • linux下异步RPC的阶段性总结-非阻塞SOCKET客户端

    尽可能使用非阻塞socket int flags s flags fcntl fd F GETFL 0 if flags 1 close fd return 1 flags O NONBLOCK s fcntl fd F SETFL fla