linux socket 套接字状态 EAGAIN EWOULDBLOCK EINTR 与非阻塞 简介
EWOULDBLOCK:用于非阻塞模式,不需要重新读或者写
EINTR:指操作被中断唤醒,需要重新读/写
在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。
从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。
例如,以 O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返 回,
read函数会返回一个错误EAGAIN,提示你的应用程序现在没有数据可读请稍后再试。
又例如,当一个系统调用(比如fork)因为没有足够的资源(比如虚拟内存)而执行失败,返回EAGAIN提示其再调用一次(也许下次就能成功)。
EAGAIN: Linux - 非阻塞socket编程处理EAGAIN错误
在linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno代码为11(EAGAIN),这是什么意思?
这表明你在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,这个错误不会破坏socket的同步,不用管它,下次循环接着recv就可以。
对非阻塞socket而言,EAGAIN不是一种错误。在VxWorks和Windows上,EAGAIN的名字叫做EWOULDBLOCK。
另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。
最后,如果recv的返回值为0,那表明连接已经断开,我们的接收操作也应该结束。
errno ==EINTR 总结
如果read()读到数据为0,那么就表示文件读完了,如果在读的过程中遇到了中断则read()应该返回-1,同时置errno为EINTR。
因此判断read的条件如下:
if <=0
{if==0{表示文件结束, 处理}if(<0 && errno==EINTR){表示中断,处理}else{否则,出错}
}
如果 write()返回0,那么就表示出错,也就是无法写入了;而如果在写的过程中遇到了中断,那么write()会返回-1,同时置errno为EINTR。因此判断write的条件如下:
if<=0{if<0{if errno==EINTR 那么重试else错误处理}if ==0break;}ssize_t readn ( int fd, void *vptr, size_t n ){size_t nleft;ssize_t nread;char *ptr;ptr=vptr;nleft=n;while ( nleft>0 ){if ( ( nread = read ( fd,ptr,nleft ) ) < 0 ){if ( errno == EINTR )nread = 0;elsereturn ( -1 );}nleft-=nread;ptr+=nread;}return ( n-nleft );}ssize_t writen ( int fd, const void *ptr, size_t n ){size_t nleft;ssize_t nwritten;const char *ptr;ptr=vptr;nleft=n;while ( nleft>0 ){if( ( nwritten=write( fd, ptr, nleft ) )<=0 ){if( nwritten<0 && errno == EINTR )nwritten = 0;elsereturn (-1);}nleft-=nwritten;ptr+=nwritten;}return (n);}
写函数write
ssize_t write(int fd,const void *buf,size_t nbytes)
write函数将buf中的nbytes字节内容写入文件描述符fd。成功时返回写的字节数,失败时返回-1,并设置errno变量。
在网络程序中,当我们向套接字文件描述符写时有俩种可能:
1) write的返回值大于0,表示写了部分或者是全部的数据;
2) 返回的值小于0,此时出现了错误,我们要根据错误类型来处理。
如果错误为EINTR表示在写的时候出现了中断错误。如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接)。
读函数read
ssize_t read(int fd,void *buf,size_t nbyte)
read函数是负责从fd中读取内容。当读成功时,read返回实际所读的字节数。如果返回的值是0,表示已经读到文件的结束了。小于0表示出现了错误。如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。
linux socket 套接字状态 EAGAIN EWOULDBLOCK EINTR 与非阻塞 简介相关推荐
- linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...
- 【Linux Socket C++】为什么IO复用需要用到非阻塞IO?EAGAIN的简单介绍与应用
目录 为什么IO复用需要非阻塞的IO EAGAIN的介绍 EAGAIN的应用 为什么IO复用需要非阻塞的IO 我们可以先看一下官方的回答: 在Linux命令行输入:man 2 select 找到[BU ...
- linux下使用fread读socket套接字的注意点
linux下使用fread读socket套接字的注意点 linux总所周知,一切皆文件.因此我们在读写文件时觉得fread,recv这些可以随便用.下面看看有哪些注意事项呢. 因为C库的文件处理函数较 ...
- Linux下套接字详解(二)----套接字Socket
在前面我们讲了TCP/IP.TCP和UDP的一些基本知识,但是协议只有一套,而我们系统多个TCP连接或多个应用程序进程必须通过同一个 TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算 ...
- 【Linux网络编程】网络基础 和 socket套接字 服务器与客户端 详细案例说明
目录 前言 一.网络编程三要素 1.IP地址 2.通信协议 3.端口号 二.SOCKET套接字 SOCKET概述 SOCKET分类 三.代码实现 1.编程思路 2.建立服务器 服务器完整代码 3.建立 ...
- Linux网络编程之Socket套接字
一.Socket到底是什么 socket 这个英文单词的原意是"插口""插槽", 在网络编程中,它的意思是可以通过插口接入的方式,快速完成网络连接和数据收发.你 ...
- alin的学习之路(Linux网络编程:一)(网络模型、帧格式、socket套接字、服务器端实现)
alin的学习之路(Linux网络编程:一)(网络模型.帧格式.socket套接字.服务器端实现) 1. 协议 协议是一组规则,规定了如何发送数据.通信的双发都需要遵守该规则 2. 网络分层结构模型 ...
- Socket套接字通信 TCP UDP详解(网络通信)
文章目录 一 什么是套接字Socket 1.Socket简介 2.Socket的域(domain) 3.Socket主要类型(type) 4.Socket基本工作流程 二 创建套接字Socket 1. ...
- Linux原始套接字学习总结
Linux网络编程:原始套接字的魔力[上] http://blog.chinaunix.net/uid-23069658-id-3280895.html 基于原始套接字编程 在开发面向连 ...
最新文章
- VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、
- 通俗的说下浏览器的渲染过程
- Json格式的netconf转成NormalizedNode
- [css] 如何更改placeholder的字体颜色和大小?
- 11--移除重复节点
- android OEM unlocking分析
- 第一章 软件工程概论
- gc的原因 频繁full_Java性能优化要点之:GC垃圾回收知识点整理
- python2.7更新pip_CentOS升级Python2.6到Python2.7并安装pip
- VCenter配置ESXI主机syslog日志收集
- GdiPlus[33]: 基本绘图与填充命令
- myeclipse安装maven
- AI语音外呼机器人是如何帮助电销行业获客?
- 关于做ceb转换cebx遇到的问题及解决方案总结
- 【论文笔记】Graph U-Nets
- 组合测试术语:Pairwise/All-Pairs、OATS(Orthogonal Array Testing Strategy)
- 【数据库】商品信息表的设计
- [译][并行计算] 1. 并行计算简介
- 基于java基于Web的人事管理系统的设计与实现计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
- Flutter入门实战教程:从0到1仿写web版掘金App (完结)
热门文章
- android 文件名 标题,有什么方法可以让Android的默认浏览器识别Content-Disposition:attachment下载中的非ASCII文件名?...
- Ansible — 编程 — 条件与循环
- 使Mybatis开发变得更加轻松的增强工具 — Ourbatis
- DHCP服务器的配置详细说明
- 通过网络方式安装linux的五种方法
- 使用 IDEA 开发工具(版本为 IntelliJ IDEA 14.1.4)打可执行jar包的操作步骤
- cobertura-maven-plugin
- WinAPI: PolyBezier - 绘制贝塞尔线
- 【斗医】【13】Web应用开发20天
- H2DBEngine——Driver的设计与实现