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 与非阻塞 简介相关推荐

  1. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

    2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...

  2. 【Linux Socket C++】为什么IO复用需要用到非阻塞IO?EAGAIN的简单介绍与应用

    目录 为什么IO复用需要非阻塞的IO EAGAIN的介绍 EAGAIN的应用 为什么IO复用需要非阻塞的IO 我们可以先看一下官方的回答: 在Linux命令行输入:man 2 select 找到[BU ...

  3. linux下使用fread读socket套接字的注意点

    linux下使用fread读socket套接字的注意点 linux总所周知,一切皆文件.因此我们在读写文件时觉得fread,recv这些可以随便用.下面看看有哪些注意事项呢. 因为C库的文件处理函数较 ...

  4. Linux下套接字详解(二)----套接字Socket

    在前面我们讲了TCP/IP.TCP和UDP的一些基本知识,但是协议只有一套,而我们系统多个TCP连接或多个应用程序进程必须通过同一个 TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算 ...

  5. 【Linux网络编程】网络基础 和 socket套接字 服务器与客户端 详细案例说明

    目录 前言 一.网络编程三要素 1.IP地址 2.通信协议 3.端口号 二.SOCKET套接字 SOCKET概述 SOCKET分类 三.代码实现 1.编程思路 2.建立服务器 服务器完整代码 3.建立 ...

  6. Linux网络编程之Socket套接字

    一.Socket到底是什么 socket 这个英文单词的原意是"插口""插槽", 在网络编程中,它的意思是可以通过插口接入的方式,快速完成网络连接和数据收发.你 ...

  7. alin的学习之路(Linux网络编程:一)(网络模型、帧格式、socket套接字、服务器端实现)

    alin的学习之路(Linux网络编程:一)(网络模型.帧格式.socket套接字.服务器端实现) 1. 协议 协议是一组规则,规定了如何发送数据.通信的双发都需要遵守该规则 2. 网络分层结构模型 ...

  8. Socket套接字通信 TCP UDP详解(网络通信)

    文章目录 一 什么是套接字Socket 1.Socket简介 2.Socket的域(domain) 3.Socket主要类型(type) 4.Socket基本工作流程 二 创建套接字Socket 1. ...

  9. Linux原始套接字学习总结

    Linux网络编程:原始套接字的魔力[上] http://blog.chinaunix.net/uid-23069658-id-3280895.html 基于原始套接字编程        在开发面向连 ...

最新文章

  1. VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、
  2. 通俗的说下浏览器的渲染过程
  3. Json格式的netconf转成NormalizedNode
  4. [css] 如何更改placeholder的字体颜色和大小?
  5. 11--移除重复节点
  6. android OEM unlocking分析
  7. 第一章 软件工程概论
  8. gc的原因 频繁full_Java性能优化要点之:GC垃圾回收知识点整理
  9. python2.7更新pip_CentOS升级Python2.6到Python2.7并安装pip
  10. VCenter配置ESXI主机syslog日志收集
  11. GdiPlus[33]: 基本绘图与填充命令
  12. myeclipse安装maven
  13. AI语音外呼机器人是如何帮助电销行业获客?
  14. 关于做ceb转换cebx遇到的问题及解决方案总结
  15. 【论文笔记】Graph U-Nets
  16. 组合测试术语:Pairwise/All-Pairs、OATS(Orthogonal Array Testing Strategy)
  17. 【数据库】商品信息表的设计
  18. [译][并行计算] 1. 并行计算简介
  19. 基于java基于Web的人事管理系统的设计与实现计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  20. Flutter入门实战教程:从0到1仿写web版掘金App (完结)

热门文章

  1. android 文件名 标题,有什么方法可以让Android的默认浏览器识别Content-Disposition:attachment下载中的非ASCII文件名?...
  2. Ansible — 编程 — 条件与循环
  3. 使Mybatis开发变得更加轻松的增强工具 — Ourbatis
  4. DHCP服务器的配置详细说明
  5. 通过网络方式安装linux的五种方法
  6. 使用 IDEA 开发工具(版本为 IntelliJ IDEA 14.1.4)打可执行jar包的操作步骤
  7. cobertura-maven-plugin
  8. WinAPI: PolyBezier - 绘制贝塞尔线
  9. 【斗医】【13】Web应用开发20天
  10. H2DBEngine——Driver的设计与实现