非阻塞的 socket 读写操作返回 EAGAIN,表示当前已经读完内核缓冲区或者写满内核缓冲区,需要等待下一次 select/poll/epoll 事件到来时再操作。

对于阻塞的 socket 读写操作,如果内核缓冲区是空,read 将一直阻塞;如果不能一下全部写入用户态缓冲区的所有数据,write 将阻塞。原以为对于阻塞的 socket,如果设置超时时间,读操作内核缓冲区为空或写操作内核缓冲区已满,返回的是 ETIMEDOUT,原来返回的也是 EAGAIN.

内核缓冲区还有 4 个字节的剩余空间,那么对于阻塞操作,如果需要写入 6 个字节,就会一直阻塞,直到 6 个字节全部写入内核缓冲区;如果设置超时,那么第一次写入会直接返回 4,表示写入了 4 个字节;第二次写入操作才返回 EAGAIN.

那么总结起来,对于 socket 操作,返回 EAGAIN 的有如下 3 钟情况。

  1. explicitly marking the file descriptor as nonblocking with fcntl();
  2. passing the MSG_DONTWAIT flag to send()
  3. setting a send timeout with the SO_SNDTIMEO socket option

下边一系列实验都是在当前本端发送缓冲区已满的情形下进行并且在此过程中,对端不进行读取操作。

1、socket 的写入操作会一直阻塞,使用 ctrl + C终止。

2、阻塞套接字设置 MSG_DONTWAIT 标志,表示本次操作非阻塞,立即返回 EAGAIN,在python 里就是抛 BlockingIOError.

3、阻塞套接字设置 SO_SNDTIMEO 发送超时选项,阻塞直到超时后返回,在python 里就是抛 BlockingIOError.

4、在 python 里,单独有个方法可以设置超时:.settimeout(),次方法不是通过设置套接字选项来实现的。下边的代码片段先关闭通过套接字选项设置的超时(通过给选项参数设置为 0),然后通过 .settimeout 方法设置超时,注意超时时,抛出的是 timeout异常,errno 并没有被设置。

blocking socket 读写返回 EAGAIN相关推荐

  1. socket读写返回值的处理

    在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...

  2. golang socket读写同时_epoll在Golang的应用

    使用Golang可以轻松地为每一个TCP连接创建一个协程去服务而不用担心性能问题,这是因为Go内部使用goroutine结合IO多路复用实现了一个"异步"的IO模型,这使得开发者不 ...

  3. linux下查看系统socket读写缓冲区

    一:linux下查看系统socket读写缓冲区大小配置: http://blog.csdn.net/herecles/article/details/8146017 1. tcp 收发缓冲区默认值 [ ...

  4. 一文搞懂socket读写数据接口API

    对文件的读写操作read和write同样适用于socket.但是socket编程接口提供了专门的几个socket读写数据的接口. UDP数据读写函数 recvfrom(从另一个IP接收数据) ssiz ...

  5. php实现返回界面,PHP实现模仿socket请求返回页面的方法

    本文实例讲述了PHP实现模仿socket请求返回页面的方法.分享给大家供大家参考.具体实现方法如下: $url = "www.XXXX.com"; //自己做替换 $parse = ...

  6. linux c之解决使用socket函数返回为0的问题

    1.问题: 在 linux 平台下 写socket,实现简单的tcp通信,服务端第一次调用 socket函数返回 0 2.找原因: 我的代码是这样写的 if ((server_sockfd = soc ...

  7. avcodec_receive_frame始终返回EAGAIN

    今天我们研究一个问题: avcodec_receive_frame()始终返回EAGAIN 根本的解决方案还需要深入debug,但是这个函数很太复杂,需要些时间和耐心: 目前在不考虑编解码性能的情况下 ...

  8. linux socket读写函数,Linux网络编程入门

    第一个函数是socket函数. socket函数的Linux头文件以及函数定义如下: #include int socket(int domain, int type, int protocal); ...

  9. java 异步socket_java Socket读写异步分离

    在Android开发中,基于Socket的通信必须是非阻塞式的,因此需要Reader和Writer异步分离,此外需要监听Socket网络状态. 监听接口 package com.io.sockets; ...

最新文章

  1. 中国高校4篇研究今日同时登上Nature!清华北大上交浙工大等在列
  2. 从生态、业绩角度分析芯片行业
  3. 2.3 利用正规化解决过拟合问题-机器学习笔记-斯坦福吴恩达教授
  4. 板材开料最优算法_板材套料软件AutoNest与Tekla Structures协同工作实现设计到加工自动化...
  5. discuz php如何开发,Discuzx2开发标准流程
  6. Codeforces Round #727 (Div. 2) E. Game with Cards dp + 思维
  7. php redis事务回滚,【Redis】Redis事务详解,Redis事务不支持回滚吗?
  8. opencv打开的图片应用于nn.Conv2d()(一)(H, W, C)转为 (C, H, W)
  9. 【白帽子讲Web安全】第一章 我的安全世界观
  10. php excel 下拉菜单,Laravel Excel库(Maatwebsite):如何在导出中创建下拉列表 - php
  11. python阿拉伯数字转中文_阿拉伯数字转换成中文的python代码
  12. 一文读懂POE交换机和普通交换机的区别
  13. 使用springboot实现redis作为mysql缓存
  14. 重新注册组件修复IE
  15. 2G、3G要退出历史舞台了?为何3G比2G淘汰更快?
  16. 操作系统leb1实验报告
  17. selenium之DDT:使用DDT模块实现数据驱动测试
  18. 蓝牙智能音箱技术方案开发
  19. 使用tableau制作瀑布图
  20. C# 生成彩色二维码

热门文章

  1. Python配置Gurobi教程
  2. yoloV5改进-针对小目标的NWD
  3. excel 成绩排名(相同的成绩,拥有相同的名次)
  4. Kali Nethunter MITMf的安装及使用(首发)
  5. 基于报表系统的的企业数据管理
  6. 推荐!各类建站程序伪静态规则代码
  7. 微信小程序将资源上传阿里云OSS
  8. 谷粒商城项目笔记之高级篇(三)
  9. css换行,溢出显示省略号
  10. usb接口wifi模块rtl8188cus issue