Tars-C++ 揭秘篇:文件描述符处理“套路”
时间:2022-06-18
本文章向大家介绍Tars-C++ 揭秘篇:文件描述符处理“套路”,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本章总结Tars中对文件描述符进行操作时的一些“套路”的做法,偏重异常时候的处理。这些处理方式在任何RPC框架中都是值得考虑的
1、bind
- 进行bind操作前,设置服务器可以快速二次启动而不用等待一段时间:
int iReuseAddr = 1;
//设置
setSockOpt(SO_REUSEADDR, (const void *)&iReuseAddr, sizeof(int), SOL_SOCKET);
- ::bind()返回值小于0时候,终止应用程序
2、listen
- ::listen()返回值小于0时候,终止应用程序
- 设置keepalive
int flag = 1;
if(setSockOpt(SO_KEEPALIVE, (char*)&flag, int(sizeof(int)), SOL_SOCKET) == -1)
{
throw TC_Socket_Exception("[TC_Socket::setKeepAlive] error", errno);
}
- 设置tcpNoDelay
int flag = 1;
if(setSockOpt(TCP_NODELAY, (char*)&flag, int(sizeof(int)), IPPROTO_TCP) == -1)
{
throw TC_Socket_Exception("[TC_Socket::setTcpNoDelay] error", errno);
}
- 设置noCloseWait
linger stLinger;
stLinger.l_onoff = 1; //在close socket调用后, 但是还有数据没发送完毕的时候容许逗留
stLinger.l_linger = 0; //容许逗留的时间为0秒
if(setSockOpt(SO_LINGER, (const void *)&stLinger, sizeof(linger), SOL_SOCKET) == -1)
{
throw TC_Socket_Exception("[TC_Socket::setNoCloseWait] error", errno);
}
- 设置noblock
void TC_Socket::setblock(int fd, bool bBlock)
{
int val = 0;
if ((val = fcntl(fd, F_GETFL, 0)) == -1)
{
throw TC_Socket_Exception("[TC_Socket::setblock] fcntl [F_GETFL] error", errno);
}
if(!bBlock)
{
val |= O_NONBLOCK;
}
else
{
val &= ~O_NONBLOCK;
}
if (fcntl(fd, F_SETFL, val) == -1)
{
throw TC_Socket_Exception("[TC_Socket::setblock] fcntl [F_SETFL] error", errno);
}
}
3、accept
- 获取accept描述符
while ((ifd = ::accept(_sock, pstSockAddr, &iSockLen)) < 0 && errno == EINTR);
- 当上面ifd不大于0时候
if(errno == EAGAIN)
//跳出外层循环accept操作
4、epoll
- 遇到EPOLLERR 和 EPOLLHUP,应当把描述符从epoll中删除,同时调用close清理描述符
if (ev.events & EPOLLERR || ev.events & EPOLLHUP)
//把描述符从epoll中删除,同时调用close清理描述符
- EPOLLIN读取数据时候
while(true)
{
char buffer[32 * 1024];
int iBytesReceived = 0;
iBytesReceived = ::read(_sock.getfd(), (void*)buffer, sizeof(buffer));
if (iBytesReceived < 0)
{
if(errno == EAGAIN)
{
//没有数据了
break;
}
else
{
//客户端主动关闭
//把描述符从epoll中删除,同时调用close清理描述符
}
}
else if( iBytesReceived == 0)
{
//把描述符从epoll中删除,同时调用close清理描述符
}
}
- EPOLLOUT发送数据时候
int bytes = static_cast<int>(::writev(sock, &buffers[0], cnt));
if (bytes == -1)
{
assert (errno != EINVAL);
if (errno == EAGAIN)
return 0;
//把描述符从epoll中删除,同时调用close清理描述符
}
int bytes = ::send(_sock.getfd(), data, len, 0);
if (bytes == -1)
{
if (EAGAIN == errno)
bytes = 0;
if (EINTR == errno)
bytes = 0; // try ::send later
//把描述符从epoll中删除,同时调用close清理描述符
}
- C#新功能--命名参数
- Tomcat 安全配置与性能优化
- 【机器学习】伪标签(Pseudo-Labelling)的介绍:一种半监督机器学习技术
- 这或许是对小白最友好的python入门了吧——13,字典初识
- PHP 安全与性能
- 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...
- Linux 系统与数据库安全
- 这或许是对小白最友好的python入门了吧——12,列表深入体验
- 初识SqlLite ---.net连接数据库
- 【实践操作】:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器
- 这或许是对小白最友好的python入门了吧——11,if语句初体验
- 你的网站做好神马搜索优化了吗?神马搜索站长工具提交
- 应用程序的通信成本
- 这或许是对小白最友好的python入门了吧——18,定义函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 技术篇-使用opencv读取图片实例演示,python安装opencv库
- 关于页更改并加入一些在线服务
- Hadoop-2.6.0为基础的Hive安装
- Python 技术篇-opencv读取中文路径图片报错及解决办法
- Javaweb鼠标事件案例分析—鼠标移入移出表格颜色变化
- docker registry V2私有仓库搭建
- Python 路径问题:cv2.error: OpenCV(4.1.0)...size.width>0 && size.height>0 in function 'cv::imshow'. 原因与解决
- 算法案例分析—字符串模式匹配算法
- Docker-软件工程集装箱技术
- PyQt5 技术篇-获取电脑屏幕桌面的宽、高和分辨率
- 使用Python快速抠图
- 值得白嫖的数据库常用操作语句汇总(数据库、数据表、数据操作)
- JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格
- 初入编程吓破胆?那是你还不懂这些!(高能预警)
- 振兴杯试题功能设计(准备)