send的 epoll_wait EPOLLOUT事件 与 MSG_WAITALL参数

2023-05-16

1、send 10G的数据,send返回值不会是10G,而是大约256k,表示你只成功写入了256k的数据。接着调用send,send就会返回EAGAIN,告诉你socket的缓冲区已经满了,此时无法继续send。

此时异步程序的正确处理流程是调用epoll_wait,当socket缓冲区中的数据被对方接收之后,缓冲区就会有空闲空间可以继续接收数据,此时epoll_wait就会返回这个socket的EPOLLOUT事件,获得这个事件时,你就可以继续往socket中写出数据。

处理EPOLLIN的时候,就可以往sockfd里写了(如果需要的话),只不过这时候,套接字如果是非阻塞的,缓冲区写满了,返回EAGAIN , 然而判断send(write/sendfile)返回值发现数据并没有发完,想要接着把数据发出去,这时候就需要暂时记录一下现场,包括fd,当前发送到buffer的哪个字节了,什么的(可以用一个结构记录下来). 然后注册EPOLLOUT事件,等待下一次触发写事件.这时要先删除这个fd注册的写事件,之后找到fd对应的buffer(这个可以用map保存起来,以fd做键去找对应的结构),从原来的没有发完的偏移处继续发数据,发完了就删掉这个map或者将struct里置空. 没有发完就再注册写事件,记录这次的位置到哪了.等待下一次触发写.

2、不用epoll,只使用send,send(fd, buff, buffLen, MSG_WAITALL)可以等待所有消息发送完才返回。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

send的 epoll_wait EPOLLOUT事件 与 MSG_WAITALL参数 的相关文章

随机推荐

  • 「xrdp」- 使用 Windows 远程 Linux 主机 @20210130

    xrdp xrdp xff0c 是 RDP 协议的服务端实现 xff0c 基于 FreeRDP 和 rdesktop 的工作 xff0c xrdp 使用 RDP xff08 远程桌面协议 xff09 向用户呈现图形化界面 该项目提供一个功能
  • 使用 STM32CubeMx + VSCode 开发 STM32

    使用 STM32CubeMx 43 VSCode 开发 STM32 目的 1 使用 STM32CubeMX配置STM32开发板 xff0c 生成Makefile工程 2 使用 VSCode 开发并调试 环境及工具 1 STM32CubeMx
  • Rust 编程之道-类型系统

    类型系统 基本类型 一切皆表达式 xff0c 表达式皆有值 xff0c 值皆有类型 xff0c 所以一切皆类型 包括 xff1a 基本类型复合类型作用域返回值 Option xff1c T xff1e Result xff1c T xff0
  • 揭露网络电脑短视频营销号中的套路【完全】

    1 temp 骗局 这是存放缓存文件的文件夹 xff0c 位置在C Users 用户名 AppData Local Temp win 43 r输入 temp xff0c 我们点进去 xff0c 看到文件雀氏非常多 xff0c 但是再一看大小
  • 用中断实现流水灯

    include lt stm32f4xx h gt define GPIO Pin 6 0x0040 LED2 define GPIO Pin 7 0x0080 LED1 define PLL M 8 define PLL N 336 de
  • debian 无法使用apt-get解决办法

    刚装完debian xff0c 发现直接apt get是用不了的 xff0c 系统会提示你插入DVD xff0c 其实是源的配置问题 xff0c 只需要在apt的源里面修改下配置就可以了 打开apt源文件 sudo vi etc apt s
  • 蜗牛星际C单黑群晖加USB网卡做链路聚合

    黑群晖挂载USB网卡 一不小心入了群晖的坑 xff0c 然后就是不停的折腾 xff0c 入手一个蜗牛星际C单 xff0c 装好DS918 43 后 xff0c 家里有ASUS RT AC5300 xff0c 就想着搞个链路聚合 首先当然是去
  • CentOS 7 安装zoneminder

    这里写自定义目录标题 CentOS 7 安装zoneminder1 安装centos系统 xff0c 最小化安装2 配置源3 安装 zoneminder 以及环境4 关闭SELinux5 配置时区6 添加php网页支持7 安装配置数据库8
  • linux deploy linux 安装mariadb 无法启动解决办法

    这里写自定义目录标题 linux deploy linux 安装mariadb 无法启动解决办法 linux deploy linux 安装mariadb 无法启动解决办法 手头一个旧手机 xff0c 就想来折腾一番 xff0c 装到数据库
  • linux deploy 安装debian11 armhf中安装Zoneminder

    linux deploy 安装debian11 stable armhf 中安装Zoneminder 折腾了无数遍 xff0c 然后感觉也没啥用 安装linux deploy 手机获取root权限 安装debian xff08 armhf
  • OpenWRT 中创建docker Openwrt和其他宿主机中的docker容器通信

    这里写自定义目录标题 OpenWRT 中使用创建docker Openwrt和其他宿主机中的docker容器通信网络拓扑一 准备1 openwrt镜像 xff0c 2 安装pve 二 PVE配置1 网络配置2 创建docker networ
  • sublime text自定义clang format插件格式化C++代码

    本文内容为在windows平台上通过 sublime text开发自定义插件实现调用clang format对C C 43 43 代码进行格式化 需要安装LLVM xff0c 下载链接 xff1a https github com llvm
  • 四种方法实现UITableView的cell高度自动计算

    UITableview是iOS开发中使用最频繁的一个控件 xff0c 在实际开发中 xff0c 我们经常需要定制cell xff0c 让cell显示图片 文字等 由于cell包含的图片和文字是根据服务器返回的数据进行填充的 xff0c 这就
  • iOS贝塞尔曲线(UIBezierPath)的基本使用方法

    简介 UIBezierPath是对Core Graphics框架的一个封装 xff0c 使用UIBezierPath类我们可以画出圆形 xff08 弧线 xff09 或者多边形 xff08 比如 xff1a 矩形 xff09 等形状 xff
  • 手机termux免root安装kali:一步到位+图形界面

    1 工具 xff1a 安卓 xff08 包括鸿蒙 xff09 手机 WiFi 充足的电量 脑子 2 浏览器搜索termux xff0c vnc viewer xff0c 下载安装 3 对抗华为纯净模式需要一些操作 xff0c 先断网 xff
  • iOS 谓词(NSPredicate)

    文档定义 NSPredicate xff1a A definition of logical conditions used to constrain a search either for a fetch or for in memory
  • 在Ubuntu20.04中安装中文输入法

    引言 在Ubuntu系统中 xff0c 无论是写文档还是在程序中写注释 xff0c 都经常需要用到中文输入法 本文简单介绍了三种输入法框架 xff0c 然后详细介绍了在Ubuntu 20 04系统中 xff0c IBus框架和Fcitx框架
  • LED的C语言应用程序

    引言 在本文中 xff0c 用C语言编写一个LED灯的应用程序 xff0c 对文章 基于HDF的LED驱动程序开发 xff08 1 xff09 xff08 2 xff09 中开发的LED灯的驱动程序进行测试 另外 xff0c 在编写LED灯
  • CodeBlocks 快捷键篇(自己整理)

    浏览最近文件 Ctrl 43 Tab 保存当前文件 Ctrl 43 S 保存所有文件 Ctrl 43 Shift 43 S 关闭当前文件 Ctrl 43 W 关闭所有文件 Ctrl 43 Shift 43 W 跳转到上一个函数 Ctrl 4
  • send的 epoll_wait EPOLLOUT事件 与 MSG_WAITALL参数

    1 send 10G的数据 xff0c send返回值不会是10G xff0c 而是大约256k xff0c 表示你只成功写入了256k的数据 接着调用send xff0c send就会返回EAGAIN xff0c 告诉你socket的缓冲