Я пытаюсь создать программу, которая отправляет несколько пакетов через 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;
}
}
Put кода в вопросе. И читайте о том, почему ['while (! File.eof()) ошибочно] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) , – molbdnilo
Вы уверены, что 'ips [i] .c_str()' возвращает действительный IP-адрес, и вы не передаете некоторую строку в 'inet_addr()', что он не может разобрать после 1238 вызовов? – nos
Я напечатал вывод 'ips [i] .c_str()' и вывод 'server.sin_addr', используя inet_ntoa, оба они напечатали правильный IP. –