UDP socket sendto limit в C/C++ с помощью Ubuntu

Я пытался создать программу, которая отправляет несколько пакетов через sendto на разные IP-адреса, но после точно 1238 вызовов sendto я получаю ошибку: «SendTo: недопустимый аргумент«(печатается perror).
Edit: через час количество вызовов для sendto составляет ровно 1231 и остается таким каждый запуск. После того, как я добавил код, который печатает что-то на экране, он возвращался к 1238 вызовам каждый запуск до ошибки, удалил этот код, он стал 1241, и примерно через час это 1231.
Если я сниму IP-адреса (делая псевдонимы автономными), он отправляет эти пакеты правильно без ошибки, но он застревает на мгновение после примерно каждых 500 вызовов sendto,

Эта ошибка происходит только тогда , когда эти IP-адреса не находятся на одном сервере, когда они находятся на одном сервере (псевдонимы) sendto работает правильно.
Кроме того, ошибка не появляется при отправке на один и тот же IP несколько раз вместо нескольких раз на разные IP-адреса.

Я пробовал различные исправления, которые я нашел при поиске в Google. Я пробовал играть с конфигурациями в sysctl.conf-файл, вызвал буфер отправки, somaxconn, backlog и другие вещи.. Когда я поднял буфер отправки, я также поднял буфер в самом приложении.

Вот пример кода, который я написал:
http://pastebin.com/FCn0ALzn

И код, который дает ошибку:

for (size_t i = 0; i < ips.size(); i++)
    {
        cout << i << ") Sending message to: " << ips[i] << endl;
        server.sin_addr.s_addr = inet_addr(ips[i].c_str());
        n = sendto(sock, buffer, strlen(buffer), 0, (const struct sockaddr *)&server, length);
        if (n < 0)
        {
            perror("Sendto");
            return;
        }
    }

1 ответ

  1. Мне удалось устранить эту проблему, очистив IP-адреса из кэша ARP. Каждые 500 вызовов кsendto, программа спит в течение нескольких миллисекунд, а затем очищает IP-адреса, которые были обработаны из кэша ARP с помощью команды оболочки: arp -d [ip]как это:

    // Clear ARP cache
    void clearIpArp(char* ip)
    {
        char arp[100] = {0};
        sprintf(arp, "arp -d %s", ip);
        system(arp);
    }