加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 更快的WinSock sendto()

发布时间:2020-12-16 07:26:57 所属栏目:百科 来源:网络整理
导读:我正在使用 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
我正在使用 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,castdest,szsad);

    ++c;
}

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

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

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

我有另一个程序正在运行侦听来自服务器的回复.我从主列表中获取服务器并将它们添加到我的阵列中.目前的问题是,通过所有这些问题需要很长时间,我想定期检查它们.

我怎么能在这里优化我的程序/循环/发送?

解决方法

我建议转到异步I / O以加快速度.一次发送一个的主要问题是,当TCP堆栈正在处理当前数据包时,您无法排队下一个数据包.

或者,您可以采用线程池方法:触发一定数量的工作线程,每个线程从FIFO中获取客户端并将数据发送到客户端.当线程完成其客户端时,它将客户端放回FIFO中并获取一个新客户端.您可以通过调整工作线程的数量来填充管道 – 但不要填充它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读