Быстрее WinSock sendto () - PullRequest
       29

Быстрее WinSock sendto ()

4 голосов
/ 04 сентября 2011

Я использую Windows Server 2008, и моя программа на C ++. Я использую WinSock2 и sendto () в цикле while (true) для отправки своих пакетов.

код вроде так:

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;
}

Мне нужно посылать как можно больше данных на столько IP-адресов в моем хосте std :: vector, насколько это возможно.

В настоящее время я работаю на сервере i7 930, и я могу достичь только 350 Мбит / с или около того.

В настоящее время я разделил свою программу на 4 потока, и все они выполняли цикл while с различными серверами, назначенными для каждого потока. Добавление большего количества потоков или запуск большего количества копий программы приводит к снижению пропускной способности.

У меня есть другая программа, выполняющая прослушивание ответов с серверов. Я получаю серверы из основного списка и добавляю их в свой массив. На данный момент проблема в том, что все они проходят слишком долго, и я хочу регулярно их проверять.

Как именно я могу оптимизировать свою программу / цикл / отправку здесь?

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

Я бы порекомендовал перейти на асинхронный ввод-вывод, чтобы немного ускорить процесс.Основная проблема с отправкой их по одному за раз заключается в том, что вы не можете поставить в очередь следующий пакет, пока стек TCP обрабатывает текущий.

В качестве альтернативы, вы можете использовать пул потоков:определенное количество рабочих потоков, и каждый выбирает клиента из FIFO и отправляет данные клиенту.Когда поток завершается со своим клиентом, он помещает клиента обратно в FIFO и выбирает новый.Вы можете заполнить конвейер, но не забивать его, настроив количество рабочих потоков.

0 голосов
/ 12 сентября 2011

High-Performance? ...

Я думаю, пришло время для подхода к порту завершения ввода / вывода ^^ ...

http://msdn.microsoft.com/en-us/library/aa365198%28v=VS.85%29.aspx

http://msdn.microsoft.com/en-us/magazine/cc302334.aspx (старый)

http://weblogs.asp.net/kennykerr/archive/2008/01/03/parallel-programming-with-c-part-4-i-o-completion-ports.aspx (старый, но хороший - предлагает прочитать и первые 3 части)

...