2017-01-15 3 views
0

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

Эта ошибка происходит только когда этот 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; 
     } 
    } 
+2

Put кода в вопросе. И читайте о том, почему ['while (! File.eof()) ошибочно] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) , – molbdnilo

+0

Вы уверены, что 'ips [i] .c_str()' возвращает действительный IP-адрес, и вы не передаете некоторую строку в 'inet_addr()', что он не может разобрать после 1238 вызовов? – nos

+0

Я напечатал вывод 'ips [i] .c_str()' и вывод 'server.sin_addr', используя inet_ntoa, оба они напечатали правильный IP. –

ответ

0

мне удалось решить эту проблему путем очистки 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); 
} 
Смежные вопросы