c – 更快的WinSock 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, 0, castdest, szsad);

    ++c;
}

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

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

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

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

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

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

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

点赞