尽可能使用非阻塞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;

}

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

非阻塞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();

}

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();

}

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

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

为了达到更高的性能,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);

}

linux socket 阻塞服务端 非阻塞客户端,linux下异步RPC的阶段性总结-非阻塞SOCKET客户端...相关推荐

  1. socket recv 服务端阻塞 python_网络编程(基于socket编程)

    网络编程(基于socket编程) socket套接字:应用程序通常通过socket"套接字"向网络发送请求或应答网络请求,是主机间或同一计算机中的进程间相互通讯 socket是介于 ...

  2. Java中Socket通信-服务端和客户端双向传输字符串实现

    场景 什么是socket 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其他计算机 ...

  3. SpringBoot(23) 集成socket.io服务端和客户端实现通信

    一.前言 websocket和socket.io区别? websocket 一种让客户端和服务器之间能进行双向实时通信的技术 使用时,虽然主流浏览器都已经支持,但仍然可能有不兼容的情况 适合用于cli ...

  4. java socket重连_Java客户端Socket在服务端重启后的异常情况处理

    碰到场景如下:Java服务器端A(使用NIO的异步IO方式),Java客户端B(使用普通IO的同步方式),在服务端A重启后,B->A的Socket毫无疑问的断了,然后就会出现一些异常情况,分析一 ...

  5. linux c++ 线程支持 多核应用,linux C++多线程服务端开发

    linux C++多线程服务端开发 UNIX 线程安全的对象生命期管理 当析构函数遇到多线程 构造不要在构造函数中注册任何回调 不要在构造函数中把this传给跨线程的对象 即便在构造函数的最后一行也不 ...

  6. iOS开发-使用OC搭建自己的Socket 包括服务端和客服端

    iOS开发-使用OC搭建自己的Socket 包括服务端和客服端 前言 开发须知 客服端 服务端 两端测试 前言 iOS开发中需要使用到Socket通信的地方,socket分为UDP和TCP,这次分享的 ...

  7. linux 插件 概念,服务端概念功能介绍

    服务端概念 服务端是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据.是实现游戏特色化的重要途径,也是最直接可以通过游戏表现出来的技术,比如你要修改某个NPC的参数,重加载后,在游戏内立 ...

  8. 新斗罗大陆Linux楼高服务端+详细图文架设教程

    本来早就准备写这篇教程了,因为现实里琐事比较多,于是推了好几天才静下心写这篇教程. 网上目前有很多关于新斗罗大陆架设教程的视频,大家如果我这里的看不太懂可以百度搜索下,看下视频会直观一些. 下面教程开 ...

  9. MFC 基于SOCKET 实现服务端客户端一对多

    注意:本篇文章源代码贴得很多,所以有点长,如果觉得阅读不方便,可以直接复制源代码到你的程序里去,也可以直接下载源码.后面整合了socket方法写了一个类,源码下载里没有. 源码下载:https://d ...

最新文章

  1. 仓库货位卡标识牌_仓储管理中的货位与标识管理
  2. Balsamiq Mockups --- 产品设计的利器
  3. python零基础怎么学-零基础的小白怎么学python?
  4. HTML5 处理响应式图片
  5. oracle vm中的xp添加共享文件夹
  6. CentOS7.4安装nginx和php5.40
  7. 页面传值,发生错误,如何传递中文信息
  8. 如何高效学python编程_如何高效自学编程?天下没有难学的python
  9. 做好产品经理,需要具备哪些技能?
  10. Unity资源加载以及释放
  11. cmd命令窗口快捷键与小技巧
  12. 基于AC自动机的表白墙解析工具
  13. cad渐开线齿轮轮廓绘制_CAD渐开线齿形怎么绘制
  14. SQL注入闭合方式及万能密码
  15. 九天揽月带你玩转EKF纸老虎(3)
  16. [经验]HP小机一次无故当机的经历总结
  17. 2020.8.5课堂笔记(多线程)
  18. java+web+股票图表_基于Echarts的股票K线图展示
  19. eladmin 后台管理 -- 登录
  20. Java单元测试工具:JUnit4(一)——概述及简单例子

热门文章

  1. python 写入excel_基于Python实现Excel的读写
  2. 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理
  3. php 标签库,PHP.MVC的模板标签系统之模板标签库
  4. zklib php,php 安装zookeeper扩展报错
  5. html静态网页模板_aspnetcore 实现简单的伪静态化
  6. java list树 广度_java树的广度优先遍历思路
  7. ib_logfile和mysql_bin_mysql的innodb中事务日志ib_logfile
  8. matlab程序约束条件,求Xij中i,j约束条件下的程序
  9. android错误怎么关机,Android系统小技巧:系统崩溃了只重启部分子系统,而不是全部重启...
  10. linux mediainfo,Ubuntu安装MediaInfo