Hi, All.При завершении проги-сервера-демона (при отладке вечно требуется новую версию запустить) и отсутствии активных коннектов (все дочерние процессы завершены и accept более не висит) порт ВСЕ РАВНО ОКАЗЫВАЕТСЯ ЗАЛИПШИМ!!!
рекомендация выполнить
int k = 1;
if ((setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &k, sizeof(k))))
перед bind(.....)
ошибок не дает, но порт не освобождает
ядро освобождает порт через 2мин.... 2 суток
а клиентская часть (и терминал) даже конектятся к этому залипшему порту..Кто сталкивался с таким? Помогите плиз.
>При завершении проги-сервера-демона (при отладке вечно требуется новую версию запустить) и отсутствии
>активных коннектов (все дочерние процессы завершены и accept более не висит)
>порт ВСЕ РАВНО ОКАЗЫВАЕТСЯ ЗАЛИПШИМ!!!
>
>рекомендация выполнить
> int k = 1;
> if ((setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &k, sizeof(k))))
>перед bind(.....)
> ошибок не дает, но порт не освобождает
>
>ядро освобождает порт через 2мин.... 2 суток
>
>а клиентская часть (и терминал) даже конектятся к этому залипшему порту..1) что показывает netstat -an ?
2) что показывает lsof | grep portnumber ?
>1) что показывает netstat -an ?
>2) что показывает lsof | grep portnumber ?команды lsoft ни на linux-е, ни на UNIX-е у нас няма :)
а netstat выдавал, что некто слушаетс-с... Но этот некто, не смотря на то,
что к нему м.б. законектиться чем угодно ничего не отвечал на запросы
tcp 0 0 0.0.0.0:9988 0.0.0.0:* LISTEN
>>1) что показывает netstat -an ?
>>2) что показывает lsof | grep portnumber ?
>
>команды lsoft ни на linux-е, ни на UNIX-е у нас няма :)lsof не всегда и не везде установлен, но на гугле точно есть :)
>
>а netstat выдавал, что некто слушаетс-с... Но этот некто, не смотря на
>то,
>что к нему м.б. законектиться чем угодно ничего не отвечал на запросы
>
>tcp 0
> 0 0.0.0.0:9988
> 0.0.0.0:*
> LISTEN0.0.0.0 - это хто???
д.б. *.9988, по крайней мере, на линухе пишет или реальный адрес на который bind сделан либо звездочку если INADDR_ANY.
netstat -ap | grep tcp - на линухе покажет root'у открытые сокеты и кто на них сидит.
>>tcp 0
>> 0 0.0.0.0:9988
>> 0.0.0.0:*
>> LISTEN
>
>0.0.0.0 - это хто???
>д.б. *.9988, по крайней мере, на линухе пишет или реальный адрес на
>который bind сделан либо звездочку если INADDR_ANY.
это если без ключика -n. и прочие реальные ip он тоже пытается резолвить, и тормозит потому. если же 'netstat -anp' (-n - don't resolve ip to names) - то нули, а не звездочка. это libresolv так ноль в имя резолвит просто.
Привет ВСЕ!
спасибо за мудрую мысль воспользоваться 'lsof'-ом
он указал на того неизвестного, который делал вид, что слушает порт, удерживая открытым дескриптор слушающего сокетаа дело было так: ...
прога-клиент 'просил' запустить процесс
все открытые дескрипторы (оказывается) плодятся и передаются сначала дочернему серверу-проге, а затем ч-з вызов system('proc1')
если теперь завершить прогу-сервер (без разницы каким способом), этот 'proc1' удерживает дескриптор слушающего сокета, ничего с ним не делая...
если завершить 'proc1' то и порт освобождается..., а строчки типа:
"tcp 0 0 172.16.101.100:9999 172.16.130.103:1103 FIN_WAIT2"
исчезают в течении 1..2 мин, да в принципе и не занимают порт
а на тестах прога-клиент 'просил' запустить не один, а до 23 процессов, и пока последнего из их не завершишь, порт остается занятым. :)с ув. BSD
>Привет ВСЕ!
>спасибо за мудрую мысль воспользоваться 'lsof'-ом
>он указал на того неизвестного, который делал вид, что слушает порт, удерживая
>открытым дескриптор слушающего сокета
>
>а дело было так: ...
>прога-клиент 'просил' запустить процесс
>все открытые дескрипторы (оказывается) плодятся и передаются сначала дочернему серверу-проге, а затем
>ч-з вызов system('proc1')
>если теперь завершить прогу-сервер (без разницы каким способом), этот 'proc1' удерживает дескриптор
>слушающего сокета, ничего с ним не делая...Надо было начинать с описания архитектуры вашего сервера, вам бы сразу сказали бы что потомки первым делом должны закрыть все неиспользуемые ими дескрипторы :)
>если завершить 'proc1' то и порт освобождается..., а строчки типа:
>"tcp 0 0 172.16.101.100:9999 172.16.130.103:1103 FIN_WAIT2"
>исчезают в течении 1..2 мин, да в принципе и не занимают порт
>
>а на тестах прога-клиент 'просил' запустить не один, а до 23 процессов,
>и пока последнего из их не завершишь, порт остается занятым. :)
>
разве это тест? вот если 'попросил' MAX_INT процессов вот это я понимаю тест :)