我的c++server记录----非堵塞下的socket读取操作
server端的主要的一个操作就是从socket的fd上进行数据读取。也就是我们经经常使用到的read函数。
欢迎关注我的server代码:http://code.taobao.org/p/fastServer/src/
今天主要是关注的正确的进行read操作
首相,我的socket是已经设置了非堵塞属性。read函数在非堵塞读取fd的时候会遇到不同的errno。
怎样正确的处理这些erron 状态呢?
1、errno == EAGAIN
该错误返回码主要是。当我们使用了 以 O_NONBLOCK的标志打开文件操作符,由于是非堵塞。我们不停的进行read操作,就会有没有数据可读的情况。此时,程序并不会堵塞起来等待数据。准备数据返回,而是read函数返回一个错误。EAGAIN。
就是提示程序没有数据可读了,请稍后 再试。
也就是我们继续recv操作。
2、errno==EINTR
这样的错误,主要是错误描写叙述Interrupted system call。操作也应该继续。
3、当我们read函数返回0的时候。 表明该链接已经断开了。我们这个时候应该把这个链接进行关闭了,也就是调用close操作
以下就是我们应该比較标准使用的一个read处理流程了,例如以下代码
int nread,
nread = read(fd, buf, 1024);
if (nread == -1) {
if (errno == EAGAIN || errno == EINTR) {
nread = 0;
} else {
close(fd);
return;
}
} else if (nread == 0) {
close(fd);
return;
}
if (nread) {
///进行对buff的处理了。
}
因此。仅仅要依照上述代码进行正确处理fd,或者套一层循环都能够。
就能够正确读取数据了。
很多其它文章,欢迎訪问http://blog.csdn.net/wallwind
我的代码文件夹:http://code.taobao.org/u/wallwind/mypro/
互相学习。互相交流
我的c++server记录----非堵塞下的socket读取操作的更多相关文章
- SQL Server索引 - 非聚集索引 <第七篇>
一.非聚集索引维护 非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此. 为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向 ...
- 第三篇——第二部分——第四文 配置SQL Server镜像——非域环境
原文:第三篇--第二部分--第四文 配置SQL Server镜像--非域环境 本文为非域环境搭建镜像演示,对于域环境搭建,可参照上文:http://blog.csdn.net/dba_huangzj/ ...
- Openfire 配置连接SQL SERVER(非默认实例)
安装好Openfire之后,紧接着进行配置. 连接数据库的时候遇上问题. 打算用我本机上的一个SQL SERVER做为数据库.但是,我本机装了几个SQL SERVER实例,现在我打算使用的是那个非默认 ...
- 简单搭建syslog-ng server记录log
### 简单搭建syslog-ng server记录log 安装syslog-ng apt-get install syslog-ng 安装syslog-ng 配置syslog-ng vim /etc ...
- SQL Server的非聚集索引中会存储NULL吗?
原文:SQL Server的非聚集索引中会存储NULL吗? SQL Server的非聚集索引中会存储NULL吗? 这是个很有意思的问题,下面通过如下的代码,来说明,到底会不会存储NULL. --1.建 ...
- C#中自己动手创建一个Web Server(非Socket实现)
目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 ...
- SQL Server 2012新特性(1)T-SQL操作FileTable目录实例
在SQL Server 2008提供FileStream,以借助Windows系统本身的API来强化SQL Server对于非结构化数据的支持后,SQL Server 2012更是推出了像Contai ...
- 【转】SQL Server 创建约束图解 唯一 主键-界面操作
SQL Server 创建约束图解 唯一 主键-界面操作 SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束, ...
- SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码)
SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE tabl ...
随机推荐
- ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number
A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...
- Loadrunner中web脚本转成JavaVuser脚本
先用web方式录制好脚本,进行参数化,关联验证等操作,之后执行以下步骤: 1)将要转换的web脚本复制出来并保存到web.txt中2)参数界定符部分需要由{}手动修改成<>,包括参数化的和 ...
- python基础学习笔记——包
包的简介 你们听到的包,可不是女同胞疯狂喜欢的那个包,我们来看看这个是啥包 官方解释: 1 2 3 4 5 6 7 8 9 Packages are a way of structuring Pyth ...
- Linux下安装SaltStack
一.配置yum源和epel源 epel源下载地址:http://pan.baidu.com/s/1o7NJ26u 1.配置yum源 (1)上传操作系统镜像文件来配置yum源,挂载点目录为/yum mk ...
- 00036_private
1.私有private 描述人.Person: 属性:年龄: 行为:说话:说出自己的年龄. class Person { int age; String name; public void show( ...
- 如何反馈问题issue?
如何反馈问题issue? 01,请提交的时候换位思考一下:如果别人给你提交一个这样的 Issue,你能快速准确的理解吗?如果不能,烦请重新整理你的语言,按照要求的格式填写.专业一点,减少不必要的口舌浪 ...
- appium+python自动化-adb logcat查看日志
前言 做app测试,遇到异常情况,查看日志是必不可少的,日志如何输出到手机sdcard和电脑的目录呢?这就需要用logcat输出日志了 以下操作是基于windows平台的操作:adb logcat | ...
- iOS 绕过https证书验证 请求数据
HTTPS和HTTP: 1.https协议需要到ca申请证书,一般免费证书很少,需要交费. 2.http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议. 3.http ...
- 【转】Python3学习笔记(urllib模块的使用)
原文地址:https://www.cnblogs.com/Lands-ljk/p/5447127.html 1.基本方法 urllib.request.urlopen(url, data=None, ...
- Android点击两次返回退出程序
代码改变世界 Android点击两次返回退出程序 private long mExitTime; public boolean onKeyDown(int keyCode, KeyEvent even ...