|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 06 May 2004 20:35:57 To : Eugene Grosbein Subject : Re: ftpd и euid -------------------------------------------------------------------------------- OK>>> Если сокет создан не рутом, то под нагрузкой получишь OK>>> EADDRINUSE при попытке bind() на 20 порт. OK>>> Если нагрузка маленькая или если сокет создан рутом, OK>>> то нормально биндиться... >>> Давно ты сталкивался? Потому что лишь относительно недавно >>> ftpd стал использовать setsockopt для REUSE. Вообще надо потестировать... EG> Да, это я с пассивным режимом перепутал. Ты совершенно прав, ftpd EG> получает EADDRINUSE и ложится в спячку... Вот только EADDRINUSE он получает вовсе не от bind() и не в том месте кода. А вот тут: 0x281351b4 in nanosleep () from /usr/lib/libc.so.4 (gdb) bt #0 0x281351b4 in nanosleep () from /usr/lib/libc.so.4 #1 0x28100a26 in sleep () from /usr/lib/libc.so.4 #2 0x804e8fd in dataconn (name=0xbfbfed10 "/bin/ls", size=-1, mode=0x80583e9 "w") at /usr/local/src/libexec/ftpd/ftpd.c:1946 #3 0x804dc1e in retrieve (cmd=0x805b23e "/bin/ls -lgA %s", name=0xbfbfed10 "/bin/ls") at /usr/local/src/libexec/ftpd/ftpd.c:1674 #4 0x8053b02 in yyparse () at /usr/local/src/libexec/ftpd/ftpcmd.y:495 #5 0x804ba99 in main (argc=2, argv=0xbfbffce8, envp=0xbfbffcf4) at /usr/local/src/libexec/ftpd/ftpd.c:639 То есть, от connect() после вполне успешного bind(): file = getdatasock(mode); ... data = fileno(file); conerrno = 0; if (connect(data, (struct sockaddr *)&data_dest, data_dest.su_len) == 0) break; conerrno = errno; (void) fclose(file); data = -1; if (conerrno == EADDRINUSE) { sleep((unsigned) swaitint); retry += swaitint; } И дело все в клиенте. А клиенту знаете что мешает? А мешает ему, в меньшей степени, net.inet.ip.portrange.last=5000, но в гораздо большей степени net.inet.ip.portrange.randomized=1. У кого затыки были, повторите свои опыты с sysctl net.inet.ip.portrange.randomized=0. Поискав ipport_randomized в sys/netinet/in_pcb.c, наверное, можно догадаться, почему с отключенной рандомизацией проблема исчезает. Eugene -- "Люди забыли эту истину," - сказал Лис, - "но ты не забывай" --- slrn/0.9.8.0 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/2609300a3d702.html, оценка из 5, голосов 10
|