更快的 WinSock sendto()

2024-06-29

我使用的是 Windows Server 2008,我的程序是用 C++ 编写的。 我在 while(true) 循环中使用 WinSock2 和 sendto() 来发送数据包。

代码如下:

while(true)
{
    if(c == snd->max)
        c = snd->min;

    dest.sin_addr.S_un.S_addr = hosts[c];
    iphead->destaddr = hosts[c];

    sendto(s, castpacket, pktsz, 0, castdest, szsad);

    ++c;
}

我需要尽快将尽可能多的数据发送到主机 std::vector 中尽可能多的 IP。

我目前在i7 930服务器上运行,只能达到350Mbps左右。

我目前将程序分成 4 个线程,所有线程都运行 while 循环,并为每个线程分配不同的服务器。 添加更多线程或运行更多程序副本会导致吞吐量降低。

我有另一个程序正在运行,侦听服务器的回复。我从主列表中获取服务器并将它们添加到我的阵列中。目前的问题是,把它们全部看完需要太长时间,而且我想定期检查它们。

我到底如何优化我的程序/循环/发送?


看看WinSock的注册 I/O 扩展 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh997032(v=ws.11)(里约)API:

RIO API 是 Windows Sockets (Winsock) 的新扩展,为您提供减少网络延迟的机会,提高消息发送率并提高需要非常高性能的应用程序响应时间的可预测性,非常高的消息率和可预测性。 RIO API 扩展允许处理大量小消息的应用程序实现更高的每秒 I/O 操作数 (IOPS)减少抖动和延迟。具有高消息速率和低延迟要求的服务器负载从 RIO API 扩展中获益最多,包括金融服务交易和高速市场数据接收和传播的应用程序。此外,当您在一台物理计算机上部署许多 Hyper-V 虚拟机 (VM) 时,RIO API 扩展可提供高 IOPS。

RIO 允许使用请求和完成队列通过预先注册的缓冲区执行发送和接收操作。发送和接收操作排队到与 Winsock 套接字关联的请求队列中。已完成的 I/O 操作被插入到完成队列中,并且许多不同的套接字可以与同一个完成队列关联。完成队列也可以分为发送完成和接收完成。完成操作(例如轮询)可以完全在用户模式下执行,而无需进行系统调用。

注册缓冲区的使用简化了与网络相关的处理,减少了抖动,此外,应用程序开发人员还可以指定协议栈使用的网络缓冲区的 NUMA 节点关联性,进一步增强整体性能,并减少延迟和抖动特性。

RIO API 扩展支持传输控制协议 (TCP)、用户数据报协议 (UDP), and 组播UDP,以及 IPv4 和 IPv6。

如果您想实现以下任一目的,可以使用 RIO API 扩展:

  • 扩展服务器以最大限度地减少每条消息的 CPU 利用率

  • 将网络堆栈的延迟贡献和抖动降至最低

  • 处理非常高速率的多播或 UDP 流量

使用 RIO API 扩展具有以下额外优势:

  • RIO 适用于 Windows Server 2012 的所有版本。

  • RIO 与普通网络适配器兼容,不需要特殊的网络适配器或 RDMA。

  • RIO 与现有的 Windows 网络功能完全兼容,包括 RSS、RSC、网络接口卡组合和静态卸载。

  • 当您在 Windows Server 2012 中部署 Hyper-V 时,RIO 可与虚拟化配合使用。

  • RIO 套接字使用标准 Windows 网络堆栈以及标准 TCP/IP 和 UDP 协议。

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

更快的 WinSock sendto() 的相关文章

  • Blowfish 加密在加密和解密过程中弄乱了前 8 个字节

    我刚刚尝试使用 openssl c 库 Blowfish 算法进行一些加密 解密 并遇到了一个奇怪的错误 解密消息的前 64 位不知何故搞砸了 我究竟做错了什么 这是代码 include
  • C# 参数隐式转换

    有这个代码 class Program static void Main string args Check 3 Console ReadLine static void Check int i Console WriteLine I am
  • 如何在不缓冲的情况下从 WCF 流式传输响应?

    我有一个宁静的 webHttpBinding 自托管WCF服务 大多数方法都会向客户端返回 xml 或 json 版本的对象 我有几个触发长时间运行的方法的 GET 方法 我想将日志响应流式传输到浏览器 或应用程序 以便用户知道发生了什么
  • 提高mmap memcpy文件读取性能

    我有一个从文件中顺序读取数据的应用程序 有些是直接从指向的指针读取mmaped 文件和其他部分是memcpyed 从文件到另一个缓冲区 我注意到在进行大型操作时性能不佳memcpy我需要的所有内存 1MB 块 以及在执行大量较小操作时的更好
  • C# 在 WebBrowser 中调用 JavaScript

    我正在尝试调用 JavaScript 方法WebBrowser WebBrowser webBrowser new WebBrowser webBrowser NavigateToString html webBrowser LoadCom
  • 如何终止从cin读取?

    我已经尝试了这里列出的一堆方法 但没有一个起作用 它总是在等待更多的输入 我试过了while std getline std cin line 和下面的方法 似乎没有任何作用 include
  • 如何获取picturebox非公开成员的值?

    我需要从 picturebox 的非公共成员获取图像矩形的值 如何获得该值 提前致谢 这是使用反射获取值的方法 PropertyInfo pInfo pictureBox1 GetType GetProperty ImageRectangl
  • 异步方法调用和模拟

    为什么模拟用户上下文仅在异步方法调用之前可用 我编写了一些代码 实际上基于 Web API 来检查模拟用户上下文的行为 async Task
  • x64 DLL 导出函数名称

    我正在尝试将 32 位 dll 和应用程序 移植到 64 位 并且我成功地构建了它而没有错误 当尝试使用我的 64 位应用程序加载它时 我注意到导出的函数名称不同 这就是我导出函数的方式 ifdef cplusplus extern C e
  • 如何使用鼠标指针和键盘快捷键捕获文本?

    我想使用 C 或 java 使用鼠标指针和键盘快捷键从打开的窗口捕获文本 喜欢babylon http babylon com 所以 我需要知道什么以及如何实施 我需要使用哪些库 或者我可以使用 winapi 吗 使用脚本语言创建您想要执行
  • 从表达式创建动态 Linq select 子句

    假设我定义了以下变量 IQueryable
  • 指示 GDB 6.5 使用目标文件中嵌入的源代码

    我一直在努力让GNU gdb 6 5 14在调试时使用嵌入在目标文件中的源代码 而不是扫描某些目录 主要原因是我是为嵌入式平台开发的 并且是交叉编译的 这意味着所有源代码都在我的电脑中 我读到了关于 ggdb3标志 其中包含许多额外信息 包
  • C# CsvHelper.ValidationException - 为什么?

    我正在尝试在 C 控制台应用程序中使用 CSVHelper 我有一个例外 CsvHelper ValidationException 标头匹配 Numer Dokumentu 未找到索引 0 处的名称 我不知道为什么 因为这个标题位于 cs
  • 将 make_shared 与可变参数模板绑定

    我正在尝试编写以下工厂类 但找不到正确的语法 template
  • IE8固定标题,可滚动GridView

    我知道有人问过这个话题 但这些帖子都已经过时了 或者在 IE8 上不起作用 简而言之 我们基本上想要在 GridView 中对列标题进行 Excel 样式锁定 我见过几个解决方案 其中一个 jquery css setExpression
  • 在 C# 中获取 Selenium RemoteWebDriver 的会话 ID

    我正在尝试获取在 SauceLabs 云上运行的测试的会话 ID 但我似乎无法访问它 我尝试过以下方法 Returns null var sessionId string RemoteWebDriver driver Capabilitie
  • 使用 解释 gprof 输出

    我试图在我的程序中找到性能问题 从而通过分析来检测代码 gprof 创建一个如下所示的平面配置文件 Flat profile Each sample counts as 0 01 seconds cumulative self self t
  • 画笔和钢笔使用指南

    制作 GDI 画笔和钢笔有多贵 我应该在添加所需的基础上创建它们并将它们包装在 using 中以便快速处理它们 还是应该创建一个类似于 System Drawing Brushes 类的静态类 IMO 它们足够高效 您通常不应该创建在多个方
  • C# 如何更改 windows.forms.listview 中的网格线颜色

    如何更改 windows forms listview 中的网格线颜色 我认为没有办法在不覆盖 Paint Event 的情况下在列表视图上执行此操作 但是 如果您能够切换到网格视图 您可以这样做 this dataGridView1 Gr
  • 为什么对于某些数组 A,sizeof(A) 在函数内不起作用? [复制]

    这个问题在这里已经有答案了 下列 include

随机推荐

  • 由于表扫描,表值参数的性能较低

    我有一个将参数传递给 SQL 过程的应用程序 其中一个参数是表值参数 其中包含要包含在 where 子句中的项目 因为当我将 TVP 连接到具有 200 万行的表时 表值参数没有附加任何统计信息 所以查询速度非常慢 我还有什么选择 同样 目
  • 处理注入的 HttpClient

    我们的 MVC 应用程序使用 HttpClient 调用 WebAPI 操作 我决定使用 StructureMap 注入 HttpClient 并覆盖控制器中的 dispose public HomeController HttpClien
  • Azure 函数中的 Autofac 依赖注入

    我正在尝试使用 Azure 函数中的 Autofac IOC 来实现 DI 我需要构建容器 但不确定将构建容器的代码放在哪里 我确实写了一篇博客文章 用于在 Azure Functions 中使用 Autofac 进行依赖项注入 看看这里
  • Python pandas:向我的数据框中添加一列来计算变量

    我有一个像这样的数据框 gt org group org1 1 org2 1 org3 2 org4 3 org5 3 org6 3 我想将列 count 添加到 gt 数据帧以计算组的成员数量 预期结果如下 org group count
  • (Linux) 如何在没有显示环境的情况下运行gtk程序? Gtk-警告 **:无法打开显示:

    我有一个必须在 GTK gui 环境中运行的程序 我只能使用ssh 该程序将在服务器 centos 6 上运行并安装 gnome X 显示 不需要看GUI 但运行完成后 我就能得到答案 VNC 和远程屏幕已禁用 当我在 ssh 中启动程序时
  • 字符串比较在 PowerShell 函数中不起作用 - 我做错了什么?

    我正在尝试创建一个别名git commit它还将消息记录到单独的文本文件中 然而 如果git commit回报 nothing to commit working directory clean 它不应该将任何内容记录到单独的文件中 这是我
  • ACRA formkey 哪里可以得到?

    所以我尝试按照以下说明进行操作https github com ACRA acra wiki BasicSetup https github com ACRA acra wiki BasicSetup但它太旧了或者什么的 使用我自己的 gm
  • 在 Photoshop 脚本中保存每个用户或每个文档的首选项

    我正在使用 ExtendScript 在 JavaScript 中编写 Photoshop 脚本 我的脚本允许一些用户输入 我想在使用之间保存它 也就是说 我正在寻找一种方法来在特定键下保存简单的字符串或数值 以便我能够在后续使用脚本时访问
  • mysql 中的 SELECT UNION 和 ORDER BY.. 如何?

    我想从单个表中获取所有行 但以不同的方式对它们进行排序 例如我写 SELECT FROM table1 ORDER BY fieldA ASC LIMIT 3 UNION SELECT FROM table1 ORDER BY FieldB
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • 检查redis是否正在运行->node js

    我只是想知道 在 NodeJS 进程开始时 Redis 是否启动 因此用户会话是否会被存储 这是我目前所拥有的 var session require express session var RedisStore require conne
  • 如何查看用户签入 Visual SourceSafe 的所有文件?

    Microsoft Visual SourceSafe 中有没有办法查看我签入过的所有文件 选择项目后 转到 工具 显示历史记录 勾选 递归 然后在 用户 中输入您的用户名 单击 确定
  • 如何在 Jenkins 工作流脚本中使用日志解析器插件

    日志解析器插件现在是与工作流程兼容 https issues jenkins ci org browse JENKINS 27208但我该如何使用它呢 最简单的就是使用片段生成器获取使用它的示例步骤语句
  • NodeJS 生成用于签名和验证消息的有效 PEM 密钥

    Context 来自关于 Node v10 9 0 的 TLS SSL 的 NodeJS 文档 2018 年 8 月 https nodejs org api tls html tls tls ssl concepts https node
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • Scala 不可变 Map 速度慢

    当我创建地图时 我有一段代码 val map gtfLineArr 8 split map split collect case Array k v gt k v toMap 然后我使用这张地图来创建我的对象 case class MyOb
  • Arduino 以太网扩展板与套接字服务器的连接

    我使用 Arduino 的以太网屏蔽将其连接到套接字服务器 不同的计算机 以便我可以从它接收消息来激活某些例程 这是我的代码 include
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn