linux socket 阻塞服务端 非阻塞客户端,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, 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客户端...相关推荐
- socket recv 服务端阻塞 python_网络编程(基于socket编程)
网络编程(基于socket编程) socket套接字:应用程序通常通过socket"套接字"向网络发送请求或应答网络请求,是主机间或同一计算机中的进程间相互通讯 socket是介于 ...
- Java中Socket通信-服务端和客户端双向传输字符串实现
场景 什么是socket 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其他计算机 ...
- SpringBoot(23) 集成socket.io服务端和客户端实现通信
一.前言 websocket和socket.io区别? websocket 一种让客户端和服务器之间能进行双向实时通信的技术 使用时,虽然主流浏览器都已经支持,但仍然可能有不兼容的情况 适合用于cli ...
- java socket重连_Java客户端Socket在服务端重启后的异常情况处理
碰到场景如下:Java服务器端A(使用NIO的异步IO方式),Java客户端B(使用普通IO的同步方式),在服务端A重启后,B->A的Socket毫无疑问的断了,然后就会出现一些异常情况,分析一 ...
- linux c++ 线程支持 多核应用,linux C++多线程服务端开发
linux C++多线程服务端开发 UNIX 线程安全的对象生命期管理 当析构函数遇到多线程 构造不要在构造函数中注册任何回调 不要在构造函数中把this传给跨线程的对象 即便在构造函数的最后一行也不 ...
- iOS开发-使用OC搭建自己的Socket 包括服务端和客服端
iOS开发-使用OC搭建自己的Socket 包括服务端和客服端 前言 开发须知 客服端 服务端 两端测试 前言 iOS开发中需要使用到Socket通信的地方,socket分为UDP和TCP,这次分享的 ...
- linux 插件 概念,服务端概念功能介绍
服务端概念 服务端是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据.是实现游戏特色化的重要途径,也是最直接可以通过游戏表现出来的技术,比如你要修改某个NPC的参数,重加载后,在游戏内立 ...
- 新斗罗大陆Linux楼高服务端+详细图文架设教程
本来早就准备写这篇教程了,因为现实里琐事比较多,于是推了好几天才静下心写这篇教程. 网上目前有很多关于新斗罗大陆架设教程的视频,大家如果我这里的看不太懂可以百度搜索下,看下视频会直观一些. 下面教程开 ...
- MFC 基于SOCKET 实现服务端客户端一对多
注意:本篇文章源代码贴得很多,所以有点长,如果觉得阅读不方便,可以直接复制源代码到你的程序里去,也可以直接下载源码.后面整合了socket方法写了一个类,源码下载里没有. 源码下载:https://d ...
最新文章
- 仓库货位卡标识牌_仓储管理中的货位与标识管理
- Balsamiq Mockups --- 产品设计的利器
- python零基础怎么学-零基础的小白怎么学python?
- HTML5 处理响应式图片
- oracle vm中的xp添加共享文件夹
- CentOS7.4安装nginx和php5.40
- 页面传值,发生错误,如何传递中文信息
- 如何高效学python编程_如何高效自学编程?天下没有难学的python
- 做好产品经理,需要具备哪些技能?
- Unity资源加载以及释放
- cmd命令窗口快捷键与小技巧
- 基于AC自动机的表白墙解析工具
- cad渐开线齿轮轮廓绘制_CAD渐开线齿形怎么绘制
- SQL注入闭合方式及万能密码
- 九天揽月带你玩转EKF纸老虎(3)
- [经验]HP小机一次无故当机的经历总结
- 2020.8.5课堂笔记(多线程)
- java+web+股票图表_基于Echarts的股票K线图展示
- eladmin 后台管理 -- 登录
- Java单元测试工具:JUnit4(一)——概述及简单例子
热门文章
- python 写入excel_基于Python实现Excel的读写
- 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理
- php 标签库,PHP.MVC的模板标签系统之模板标签库
- zklib php,php 安装zookeeper扩展报错
- html静态网页模板_aspnetcore 实现简单的伪静态化
- java list树 广度_java树的广度优先遍历思路
- ib_logfile和mysql_bin_mysql的innodb中事务日志ib_logfile
- matlab程序约束条件,求Xij中i,j约束条件下的程序
- android错误怎么关机,Android系统小技巧:系统崩溃了只重启部分子系统,而不是全部重启...
- linux mediainfo,Ubuntu安装MediaInfo