文档章节

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

阿阮
 阿阮
发布于 2015/09/23 10:03
字数 433
阅读 241
收藏 3
  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,其他错误按照出错处理














© 著作权归作者所有

阿阮
粉丝 36
博文 11
码字总数 3987
作品 0
海淀
架构师
私信 提问
一个RPC服务客户端代理中间件的设计过程的回顾

一个RPC服务客户端代理中间件的设计过程的回顾 0 前言 近两年来,负责重新设计和开发一组RPC服务调用的中间件的通讯模块,包括RPC服务端模块(RPC服务容器I/O通讯模块),以及一个RPC客户端代...

先进哥
2016/06/05
164
0
深入剖析通信层和 RPC 调用的异步化 :一

异步的一些常见误区 1.1. 常见的理解误区 在将近 10 年的平台中间件研发历程中,我们的平台和业务经历了从 C++ 到 Java,从同步的 BIO 到非阻塞的 NIO,以及纯异步的事件驱动 I/O(AIO)。服务...

Java干货分享
01/14
97
0
为 Unix 程序员准备的 Windows 异步 I/O 教程

在阅读之前,我认为你已经掌握了Unix系统上的非阻塞的Socket I/O。 同样的,在Windows系统上也能够找到select这个系统调用。但是,select 在文件描述上实现的是一个O(n)的算法,他并不像现在...

oschina
2014/04/01
5.8K
14
网络通信基础重难点解析 08 :connect 函数在阻塞和非阻塞模式下的行

版权声明:欢迎关注我的微信公众号:「easyserverdev」,中文名:『高性能服务器开发』。 https://blog.csdn.net/analogous_love/article/details/88721194 connect 函数在阻塞和非阻塞模式下...

analogous_love
03/21
0
0
关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO,MQ的总结

RabbitMQ, ZeroMQ, Kafka等MQ则是基于异步的封装插件。 但是IOCP是对于SOCKET的封装,而MQ一般是对于普通消息的封装,应该不是同一个事情。 相关资料 IO基本概念 Linux环境 Linux的内核将所有...

andrewniu
2018/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

反编译9.png图片还原

本文链接:https://blog.csdn.net/a1140778530/article/details/10528507 经常反编译apk文件找资源,9.png的文件处理起来很麻烦。 最近使用Ant自动编译打包app时,从别处搜罗来的9.png文件导...

shzwork
10分钟前
2
0
Shell脚本应用 – for、while循环语句

一、for循环语句 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。 当面对各种...

linux-tao
10分钟前
2
0
RPA风潮下企业财务工作模式的变革

RPA(机器人流程自动化)在财务领域的应用,正给企业财务带来前所未有的改变。 前RPA时代,财务领域面临的痛点 在RPA机器人应用之前,企业财务工作进程的推进,主要通过财务人员人工操作或信...

UiBot
15分钟前
3
0
Hive之命令行修改表注释

最近遇到一个需求,在不重建表的情况下,修改表的注释,hive有没有类似关系型数据库的SQL命令来修改呢,找了下,亲测有效,如下List-1 List-1 hive>use your_schemahvie>ALTER TABLE tabl...

克虏伯
16分钟前
3
0
是什么,它的作用是什么

在HTML文档的首部往往会有这么一句话<!DOCTYPE html>,许多时候我们忽视了它的存在,它实际上是一个声明,告诉浏览器用哪种HTML版本的规范来解读HTML文档。 尽管我们不给出这句声明浏览器照样...

前端老手
21分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部