epoll移植到windows的可行性研究

2023-11-16

1、各有千秋

linux作为高效稳定的操作系统,部署在大量的服务器上。epoll在linux下,一个高性能的网络IO模型,在服务端领域发挥着重要的作用。但在开发效率上,windows以及visual studio系列因其良好的用户体验而更受用户青睐。如果能够将linux的运行期优势和windows开发期的优势,有机地结合在一起,是一个不错的主义。

2、模型差异

和epoll相对应的是网络IO模型是windows下的IOCP模型,但两者之间存在一个很大的差别在于,epoll是在当资源可用时,系统触发事件,应用层在执行操作;而iocp是由应用层预先分配操作资源,在操作完成后,系统再触发事件。在操作和事件触发的时间顺序上正好相反。

除此之外,在接口设计上也诸多不同。虽然windows也提供了诸如socket、accept、send、recv之类的函数。可是,因为epoll和iocp设计上的不同,不但不能直接使用,反而变成了epoll移植到windows上的障碍。

3、accept的移植

异步accept在windows下对应的是AcceptEx函数,这个函数会预先分配一个socket,当真实连接请求进入时,再使用setsockopt和GetAcceptExSockaddr获取对应的信息。于是,我们可以将第一步AcceptEx作为一个事件注册的动作,隐藏在系统内部。当事件触发后,在accept时,就执行后续的连接信息获取动作,就可以和posix c的accept动作对应起来。

4、recv的移植

在正常模式下,应用层需要向IOCP注册一个读取缓冲区,在读取完成后,IOCP触发一个读取完成事件。比较幸运的是,如果应用层注册的是一个零字节的缓冲区,那么在缓冲区可读时,IOCP也会立即返回一个事件。于是,事件和操作的顺序,就可以和epoll一致了。

事情依然没有结束,当recv执行读取操作时,如果返回WSA_IO_PENDING时,那么操作就没有完成,函数就不能返回。这时候,只能进入阻塞状态,等待读取完成。那么总体的性能就会因此而降低。但同样的是,windows为我们提供一个ioctsocket的FIONREAD命令接口,让我们可以偷看读缓冲区中,究竟有多少个字节已经就绪,这样就可以避免陷入WSA_IO_PENDING的状态。

5、send的移植

send遇到的问题,和recv是一样的。也可以通过注册一个零字节的写缓冲区,在IOCP触发可写事件后,再执行写操作,从而保证和epoll的顺序相同。

但不幸的是,send可以写多少个字节而不会触发WSA_IO_PENDING,windows却没有提供对应的接口。这个问题其实很容易理解,send的可写字节是由连接上的收发双方共同决定的,注意,是双方,而不是单纯地由可写缓冲区单独决定。那么,这个事情就会变得复杂。

简单起见,我们只能在内部管理一个缓冲区,将外部的发送请求数据先行拷贝到这个缓冲区,再由这个缓冲区向IOCP发送数据。通过这个缓冲区,我们就可以控制知道多少个字节可写,即使触发WSA_IO_PENDING,应用层也无需知道,也不会造成内部线程阻塞。但是性能也会因为拷贝而损失。

6、接口移植

windows提供了和posix c一样的socket类函数,因此如果我们改造 后的socket函数显然无法和winsock函数共存,但是又不能不用winsock函数。因此,最好的办法是通过动态加载ws2_32.dll,并导入到函数指针中,这个函数指针可以与原始函数名不同。在我们提供的函数中,仍然可以使用原名,同时,在这些函数中,插入我们而外增加的代码。

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

epoll移植到windows的可行性研究 的相关文章

  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 在 System.Windows.Forms.RichTextBox 中禁用 VScrollbar 的绘制

    我有一个继承自 RichTextBox 的自定义控件 该控件能够 禁用 富文本编辑 我通过在 TextChanged 事件期间将 Rtf 属性设置为 text 属性来实现此目的 这就是我的代码的样子 private bool lockTex
  • 如何安全地将对象(尤其是 STL 对象)传入和传出 DLL?

    如何将类对象 尤其是 STL 对象 传入和传出 C DLL 我的应用程序必须以 DLL 文件的形式与第三方插件交互 并且我无法控制这些插件是使用什么编译器构建的 我知道 STL 对象没有保证的 ABI 并且我担心这会导致我的应用程序不稳定
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • WinError6 句柄无效 Python 3+ 多处理

    我正在运行一个 Python 3 7 Flask 应用程序 它使用flask socketio设置一个socketio用于浏览器客户端的服务器 另一个连接到单独远程的Python进程socketio服务器和交换消息 以及另一个从 PIR 传
  • 如何创建共享网络目录或文件的超链接?

    我检查了以下两个相关讨论 1 如何创建指向本地可执行文件的超链接 https stackoverflow com questions 2815982 how do i make a hyperlink to a local executab
  • 如何查明 Ubuntu 上安装了哪个版本的 GTK+?

    我需要确定 Ubuntu 上安装了哪个版本的 GTK 男人似乎不帮忙 这个建议 https stackoverflow com a 126145 会告诉您安装了哪个 2 0 的次要版本 不同的主要版本将具有不同的包名称 因为它们可以在系统上
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 用于在 Windows 中自动执行桌面活动的 Python 代码

    我想使用 Python 在 Windows 环境中自动化桌面活动 怎样才能做到呢 一些例子也会有帮助 我所说的桌面活动是指控制鼠标和键盘 访问活动窗口属性 双击桌面上的图标 最小化和最大化窗口 通过键盘向输入弹出窗口输入数据等操作 看一下S
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 在远程桌面上使用 Powershell 获取 Windows DisplayLanguage

    我正在尝试通过 powershell 获取 Windows 显示语言设置远程计算机 我尝试了 Get WinUserLanguageList 但这会返回所有语言的列表 Get WinSystemLocale 和 Get Culture 也不
  • 如何使用Python在没有窗口的情况下在屏幕上显示文本

    问题 我需要在没有窗口的情况下直接将文本写入屏幕 文本需要显示在所有其他窗口和全屏应用程序之上 并且不应以任何方式单击或交互 Example The text doesn t need to have a transparent backg
  • 使用 CreateRestrictedToken(LUA_TOKEN) 从提升的进程创建低/中进程

    我正在尝试从提升的进程创建中或低完整性进程 我知道还有其他类似的问题 但它们主要关注使用资源管理器或任务计划程序等解决方法 我想坚持使用CreateRestrictedToken CreateProcessAsUser 我认为一定可以以某种
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足

随机推荐

  • 大数据实训报告_重磅|数据酷客?大数据精准营销综合实训软件平台隆重发布...

    北京大数据研究院博雅大数据学院第二套大数据专业综合实训产品 数据酷客 大数据精准营销综合实训软件平台隆重发布 大数据精准营销综合实训软件平台 平台介绍 首先 通过对海量结构化数据和非结构化文本数据的深度分析和挖掘 构建全方位的客户标签体系
  • MATLAB打开后一直在初始化,或者初始化很慢问题

    问题描述 遇到MATLAB启动较慢 进入主界面后 一直停留在 正在初始化 的状态 浪费很多时间 这种问题大多是因为MATLAB软件在启动时寻找本机的许可证或者是设置了 LM LICENSE FILE 的环境变量 这个变量告诉 MATLAB
  • 软件工程毕业设计选题java_软件工程毕业设计选题

    2020 01 24 东哥毕设 1122 1 分管理员和用户 国资处 三个角色 国资处这个角色一定要有 管理员 1 对用户进行增删改查 2 对设备信息管理 基本信息里面需要包括设备存放地址这个字段 这里必须有 一个状态字段 管理员添加了设备
  • 价值创造链路及经营计划

    价值创造过程最主要的环节是建立链接 北京万柳书院在网上热议 其背后是人与人的大量链接 近期热议的湖南卫视春晚亦如是 这种链接为价值的设计 沟通 传递创造条件 企业以客户为中心设计产品 往大了说是企业的生存根本 往小了说则是经营技巧 产品就是
  • TCP协议(三次握手)

    TCP Transmission Control Protocol 协议的全称是传输控制协议 它负责为不同终端系统的应用进程之间提供面向连接的通信服务 即TCP协议能够对自己提供的连接实施控制 它是一种可靠的传输层协议 一 TCP协议简介
  • 西门子PPI通讯协议

    过硬件和软件侦听的方法 分析PLC内部固有的PPI通讯协议 然后上位机采用VB编程 遵循PPI通讯协议 读写PLC数据 实现人机操作任务 这种通讯方法 与一般的自由通讯协议相比 省略了PLC的通讯程序编写 只需编写上位机的通讯程序资源S7
  • 磁环相关的计算公式

    磁环相关的计算公式 公式来源 收集于各大网站 公式仅供参考 如有错误或不全的 欢迎留言指出 通过查磁环手册或咨询供应商可知的固有量 磁环外径 D 单位mm 磁环内径 d 单位mm 磁环高度 h 单位mm 磁环芯材磁导率 u 可推导的量 导磁
  • Java 获取两个List的交集和差集,以及应用场景

    背景介绍 在实际项目中 特别是一些管理后台类的项目 会遇到底层数据是按照一对多关系的数据表存储的管理界面 列表页是一对多关系中一对应的数据列表 二级的详情页中是一对多关系中多对应的多条数据展示 通常二级页面是能够增 删 改数据的编辑页面 在
  • 使用 pymysql 操作MySQL数据库

    安装PyMySQL PyMySQL是一个Python编写的MySQL驱动程序 让我们可以用Python语言操作MySQL数据库 首先 使用pip安装PyMySQL pip install PyMySQL 使用PyMySQL 简单使用 如果有
  • Redis学习笔记①基础篇_Redis快速入门

    若文章内容或图片失效 请留言反馈 部分素材来自网络 若不小心影响到您的利益 请联系博主删除 资料链接 https pan baidu com s 1189u6u4icQYHg 9 7ovWmA 提取码 eh11 在线视频 https www
  • Android Jetpack Compose之状态持久化与恢复

    目录 1 概述 2 实例解析 4 Compose提供的MapSaver和ListSaver 4 1 mapServer 4 2 ListSaver 1 概述 在之前的文章中 我们提到了remember 我们都知道remember可以缓存创建
  • 华为云技术开放日(第三季)活动报道

    智能共生 链接未来 华为云技术开放日 第三季 精彩回顾 7 月 29日 8 月 12 日 由华为云与中生代技术社区联合主办的华为云技术开放日 第三季 圆满落下帷幕 本次技术开放日邀请了华为云 MVP 李弋凡 华为公司5G产品线首席架构师廖尔
  • 虚函数与虚函数表

    虚函数与虚函数表 一 概述 为了实现C 的多态 C 使用了一种动态绑定的技术 这个技术的核心是虚函数表 下文简称虚表 本文介绍虚函数表是如何实现动态绑定的 二 类的虚表 每个包含了虚函数的类都包含一个虚表 我们知道 当一个类 A 继承另一个
  • LeetCode 189. 轮转数组

    前言 Wassup guys 我是Edison 今天是 LeetCode 上的 leetcode 189 轮转数组 Let s get it 文章目录 1 题目分析 2 题目图解 思路一 右旋 k 次 依次移动一个 思路二 额外开数组 思路
  • 【学习笔记之操作系统原理篇】进程管理

    进程的概念 进程 单道程序 特点 顺序性 封闭性 独占性 可再现性 多道程序系统 特点 间断性 相互制约竞争资源 失去封闭性 共性资源 多个程序操作相同资源 不可再现性 运行结果不唯一 因为执行顺序不唯一 进程特征 动态性 一个进程可以对应
  • 写博客有哪些好用的工具和软件?

    写博客有哪些好用的工具和软件 在各种平台上写文章 要有一个好用的编辑器 使用简单方便 不用花很多时间排版 能预览效果等 此外 文章还需要配图片 动图和视频等 所以需要好用的截图软件 视频录制和剪辑软件 本文介绍我自己使用的软件和工具 本人认
  • mysql 重复下单_你的项目是如何处理重复请求/并发请求的?

    你的项目是如何处理重复请求 并发请求的 对于一些用户请求 在某些情况下是可能重复发送的 如果是查询类操作并无大碍 但其中有些是涉及写入操作的 一旦重复了 可能会导致很严重的后果 例如交易的接口如果重复请求可能会重复下单 重复的场景有可能是
  • GD32,在电源电路VDD VDDA VREF+/-参考设计

    GD32 在电源电路参考设计 https bbs 21ic com icview 2568876 1 9 html 资料来源于微信公众号 life and family 更多相关资料可以关注下该公众号 对于GD32 在电源电路设计方面的一些
  • C语言中volatile关键字,简单说明

    C语言中volatile关键字 如 define GPIO1 DR volatile unsigned int 0x0209C000 数据寄存器 每一位代表一个GPIO的0或1 一句话 使用volatile修饰后 会强制你每次引用GPIO寄
  • epoll移植到windows的可行性研究

    1 各有千秋 linux作为高效稳定的操作系统 部署在大量的服务器上 epoll在linux下 一个高性能的网络IO模型 在服务端领域发挥着重要的作用 但在开发效率上 windows以及visual studio系列因其良好的用户体验而更受