LINUX.ORG.RU

udp sendto errno == 22

 ,


0

1

при отправке очередного udp пакета появляется ошибка 22, причем до этого момента успешно отправилось 1021 пакета (на разные адреса, не мультикаст)
очень подозрительное число успешных отправок, может настройка в системе ограничивает sendto ?

★★★★★

google errno 22 sendto достаточно для изучения

anonymous ()

Invalid argument же. смотри где и что затираешь.

Постинг заблокирован: 4.3 Провокация flame

Что за херня?

anonymous ()
Ответ на: комментарий от anonymous

ничего не затираю, в цикле все создаю и передаю
все ок до тысячи, далее ошибка

x905 ★★★★★ ()
Ответ на: комментарий от x905

Ща погоди, штатный телепат говорит, что у тебя в 117 строке ошибка.

anonymous ()
Ответ на: комментарий от x905

а вообще да. 1024 это количество доступных дескрипторов для процесса. 1, 2, 3 -уже заняты консолью. так что остаются 1021

Пробуй закрывать.

anonymous ()
Ответ на: комментарий от x905

ничего не затираю

А косвенно? Где-то не заметил, перезаписал память, а ошибка выскочила в sendto().

gag ★★★★★ ()
Ответ на: комментарий от anonymous

пробовал увеличить через ulimit число «open files» до 8000 - не помогает, не оно ?

x905 ★★★★★ ()
Ответ на: комментарий от gag

нет, всё в рамках { } цикла, ничего вне его не делаю

x905 ★★★★★ ()
Ответ на: комментарий от x905

Посмотри еще ls -l /proc/$pid/fd. А вообще да, код в студию :)

joy4eg ★★★★★ ()
Ответ на: комментарий от uuwaan

код простой

	struct rlimit limit;
	getrlimit(RLIMIT_NOFILE,&limit);
	ERROR("cur: %1, max: %2",limit.rlim_cur,limit.rlim_max);

	int sendCnt = 0;
	for (int n1 = 105 ; n1 < 111; n1++)
	for (int n2 = 0 ; n2 < 200; n2++)	{
		QString hostStr = QString("172.20.%1.%2").arg(n1).arg(n2+1);
		struct sockaddr_in si_other;
		int s, slen=sizeof(si_other);
		if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) { ERROR("socket error"); return;}
		memset((char *) &si_other, 0, sizeof(si_other));
		si_other.sin_family = AF_INET;
		si_other.sin_port = htons(60006);
		if (inet_aton(hostStr.toLatin1().constData(), &si_other.sin_addr)==0) { ERROR("inet_aton error"); return;}

		if (sendto(s, ba.constData(), ba.size(), 0, (const struct sockaddr *)&si_other, slen)==-1) { ERROR("sendto error, error %1, was sent %3", errno, sendCnt); return;}
		sendCnt++;
		::close(s);
	}


вначале вывод cur: 8000, max: 8000

x905 ★★★★★ ()
Ответ на: комментарий от x905

Может, оно и ни при чём, но у тебя утекает сокет при любой ошибке внутри цикла.

uuwaan ★★ ()
Ответ на: комментарий от uuwaan

пускай утекает, это тест да и ни одной ошибки не возникает кроме как после отправки

x905 ★★★★★ ()
Последнее исправление: x905 (всего исправлений: 1)
Ответ на: комментарий от x905

Что-то мне подсказывает...

1024 это количество доступных дескрипторов для процесса. 1, 2, 3 -уже заняты консолью. так что остаются 1021

Пробуй закрывать.

uuwaan ★★ ()
Ответ на: комментарий от uuwaan

кого закрывать ?
close в конце разве не пытается это сделать ?

да и лимит стоит 8000, и он не превышен
причем если убрать close в конце и повторять попытки, то постепенно

ls -l /proc/$myPid/fd|wc -l
дойдет до 8000 и будет ошибка сокета
т.е. это не ограничение количества файлов, а чтото в сетевом стеке полагаю
я пытался увеличить разные буфера в системе, но не помогло

x905 ★★★★★ ()
Последнее исправление: x905 (всего исправлений: 1)
Ответ на: комментарий от x905

А все IP, на которые ты шлёшь, рабочие? Мне кажется, что ошибка, которая тебе прилетает, не от последнего sendto, а от одного из предыдущих. У меня было такое один раз.

uuwaan ★★ ()
Ответ на: комментарий от uuwaan

все рабочие, сам делал
и проверял - просто n1 начинал не со 105 а например со 109 т.е. чтобы вся 1000 была послана

причем если я сделаю эти ip на томже хосте, то ошибок нет (надо былобы сразу это сказать забыл)

т.е. чтото происходит при реальной отправки по сети (обычная сеть, без умных железок, второй хост-приемник рядом стоит)

x905 ★★★★★ ()
Последнее исправление: x905 (всего исправлений: 1)
Ответ на: комментарий от x905
ERROR("sendto error, error %1, was sent %3", errno, sendCnt);

не знаю, что это за хрень, но скорее всего печатается не sendCnt, а мусор

anonymous ()
Ответ на: комментарий от anonymous

это макрос обертка над qDebug() и QString::arg
да, там должно быть %2, но и с %3 также работает ок, фича )

не в ней дело (на приемной стороне также вывожу количество принятого, оно совпадает с переданным)

x905 ★★★★★ ()
Последнее исправление: x905 (всего исправлений: 1)
Ответ на: комментарий от anonymous

#sysctl -w fs.file-max=8000

И система раком встанет, ага. Это настройка для _общего_ числа открытых файлов в системе.

anonymous ()
Ответ на: комментарий от x905

гм, а нахрена открывать/закрывать каждый раз сокет ? Это же не tcp! Открыл раз и посылай сколько хочешь!

PS

htons тебе религия делать позволяет, а сделать «si_other.sin_addr.s_addr = htonl((172 << 24) | (20 << 16) | (n1 << 8) | n2)» вместо адской кнструкции QString & inet_aton почему-то нет...

PPS

а на счет ошибки - ты на адрес сети случайно не попадаешь ? Оно как и широковещательная рассылка требует особых setsockopt() и если верить документации возвращает как раз EINVAL.

Если бы в error() был виден ip (тем более, что он у тебя строка), то вопросов могло быть меньше.

vel ★★★★★ ()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

гм, а нахрена открывать/закрывать каждый раз сокет ? Это же не tcp! Открыл раз и посылай сколько хочешь!

+

gag ★★★★★ ()
Ответ на: комментарий от x905

[code]::close(s);[/code]

Почему у close такой спецификатор именного пространства в отличие от socket/sendto...?

gag ★★★★★ ()
Ответ на: комментарий от vel

гм, а нахрена открывать/закрывать каждый раз сокет

а разве это запрещено и именно это приводит к ошибке ?
вроде и так тоже пробовал - это ничего не меняет

а на счет ошибки - ты на адрес сети случайно не попадаешь ?

нет, все с адресами ок (я отсылал и второй половине, если начинать с середины)

завтра буду пробовать еще разные варианты ...

собственно ровно этаже ошибка (22) возникла при работе с qudpsocket, я уж подумал в нем ошибка, потому и переписал на «сырых» сокетах, отсюда и разные qstring, что собственно не влияет ни на что

x905 ★★★★★ ()
Ответ на: комментарий от gag

Почему у close такой спецификатор именного пространства в отличие от socket/sendto...?

потому что этот код вызывается в слоте нажатия на кнопку и в нем close закрывает qwidget

x905 ★★★★★ ()
Ответ на: комментарий от x905

В error() выведи ip-адрес на котором возникае ошибка.

Проверь, что возвращает ::close(s)

Если все плохо и непонятно - запусти через strace, возможно поймешь причину.

vel ★★★★★ ()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

strace ничего полезного не показал

...
sendto(24, "\0224Vx\220\0224Vx\220\0224Vx\220\22", 16, 0, {sa_family=AF_INET, sin_port=htons(60006), sin_addr=inet_addr("172.20.110.23")}, 16) = 16
sendto(24, "\0224Vx\220\0224Vx\220\0224Vx\220\22", 16, 0, {sa_family=AF_INET, sin_port=htons(60006), sin_addr=inet_addr("172.20.110.24")}, 16) = 16
sendto(24, "\0224Vx\220\0224Vx\220\0224Vx\220\22", 16, 0, {sa_family=AF_INET, sin_port=htons(60006), sin_addr=inet_addr("172.20.110.25")}, 16) = -1 EINVAL (Invalid argument)


адрес 172.20.110.25 может быть «другим» если я начну передачи с иного т.е. гдето в районе отправки на 102х адрес по порядку происходит ошибка

создание сокета вынес наружу цикла, в цикле только установка sin_addr и отправка

x905 ★★★★★ ()
Последнее исправление: x905 (всего исправлений: 1)
Ответ на: комментарий от x905

1. я могу отправить 800 пакетов на адреса 172.20.105.1 ... 172.20.109.200 успешно
2. я могу выполнять шаг 1 много раз, в сумме отправив например 10000 пакетов

но если я «перехожу» в шаге 1 через много сетей (105,106, ... 111) то получаю ошибку на сети 172.20.110.х

может где настройку надо сделать в сети отправителя ?
на отправители сейчас задан адрес 172.20.100.х и маска 16

x905 ★★★★★ ()
Ответ на: комментарий от x905

Сделай уже мультикаст. Или приемник нифига не твой?

anonymous ()
Ответ на: комментарий от x905

На машине, где запускается эта прога адрес 172.20.110.х/16 ?

запускай tcpdump и смотри свои udp и icmp.

Возможно это реакция на ошибки приходящие от других хостов по icmp.

А в dmesg нет ругани?

vel ★★★★★ ()
Ответ на: комментарий от x905

tcpdump/wireshark возможно не помешает посмотреть. Может свитч не справляется или получатель? Если паузы сделать в цикле, что будет?

Elyas ★★★★★ ()
Ответ на: комментарий от x905

man 7 ip

       EINVAL Invalid argument passed.  For send operations this can be caused by sending to a blackhole route.

anonymous ()
Ответ на: комментарий от vel

А в dmesg нет ругани?

а вот это я совсем и забыл, спасибо что напомнил, все сразу стало ясно, там было «neighbour table overflow» и сразу решение нашел

net.ipv4.neigh.default.gc_thresh1 = 2048
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192

x905 ★★★★★ ()
Ответ на: комментарий от x905

neighbour table overflow

тьфу ты. а ведь еще пол года не прошло как такое же ловил

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.