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

更快的WinSock发送到() 我使用Windows Server 2008,我的程序是C++。 我在while(true)循环中使用WinSock2和sendto()发送数据包,c++,winsock,sendto,C++,Winsock,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发送

代码如下:

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循环,每个线程都分配了不同的服务器。 添加更多线程或运行更多程序副本会导致吞吐量降低

我有另一个程序正在运行,监听服务器的回复。我从主列表中获取服务器并将其添加到阵列中。目前的问题是要花太长的时间来检查所有这些文件,我想定期检查它们


我怎样才能优化我的程序/循环/发送呢?

我建议使用异步I/O来加快速度。一次发送一个数据包的主要问题是,当TCP堆栈处理当前数据包时,您无法将下一个数据包排队

或者,您可以采用线程池方法:启动一定数量的工作线程,每个工作线程从FIFO中拾取一个客户机并将数据发送到客户机。当一个线程处理完它的客户机后,它会将客户机放回FIFO,并选择一个新的。您可以通过调整工作线程的数量来填充管道,但不能淹没管道。

看看WinSock(RIO)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)、多播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协议


数据包大小为79字节,包括以太网+ip+udp报头。我想发送更多pps。你想让我们帮助你编写拒绝服务工具吗?你误解了。它不是DoS工具,我的主机阵列中有许多服务器,每台服务器都会收到我无法编辑的其他评论:我有另一个程序正在运行,正在侦听服务器的回复。我从主列表中获取服务器并将其添加到阵列中。目前的问题是要花很长时间才能全部检查,我想定期检查。@Seth,好的,很抱歉怀疑你的意图。当我想到尽可能快地发送数据包时,首先想到的是DOS。这是错误的。异步I/O不会神奇地改变TCP/IP堆栈与数据的关系。