Прошу прощения за возможно нелепый вопрос. Но такая ситуация:
пробую писать маленькое приложение, принимающее соединения по tcp, для проверки на него отсылаю данные из другой программки. Все работает хорошо, за исключением одного момента:
после каждого сеанса связи остаются соединения со статусом CLOSED. И их с каждям разом становится больше.# netstat -na | grep 1900 | grep CLOSED | head
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38508 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38503 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38496 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38484 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38479 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38474 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38466 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38461 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38456 CLOSED
tcp4 0 0 172.30.0.1.1900 172.30.0.1.38447 CLOSED
# netstat -na | grep 1900 | grep CLOSED | wc -l
249В связи с чем у меня вопросы:
1. Что мне нужно подправить в программах, чтобы эти сокеты быстрее исчезали из вывода netstat ?
2. Есть ли какой-нибудь sysctl, который позволит убирать такие соединения побыстрее (может, таймаут какой существует на присутсвие таких сокетов)?
Прям в соседней теме на опеннете:---
TIME_WAITПосле того как соединение закрывается сокет переходит в состояние TIME_WAIT
В этом состоянии он может находится по умолчанию в течение 60 секунд.
Время можно изменить через sysctl (в миллисекундах деленных на 2, 2 x 30000 MSL = 60 секунд):sysctl net.inet.tcp.msl=30000
---см. http://www.opennet.me/base/net/tune_freebsd.txt.html
Поставь секунд 5-10 - сразу полегчает.
> см. http://www.opennet.me/base/net/tune_freebsd.txt.html
> Поставь секунд 5-10 - сразу полегчает.Поставил
sysctl net.inet.tcp.msl=3000не полегчало :)
Пошел искать дальше, нарыл ссылку на http://www.ibm.com/developerworks/systems/library/es-nweb/in..., посмотрел там код и добавил себе закрытие сокетов после fork() в новом и родительском потоках:
if((fd = accept(sockfd, (struct sockaddr *) &sa, &n)) != -1) {
/* принимаем соединение */
if(!fork()) { /* обрабатываем в новом потоке */
(void)close(sockfd); // добавил по примеру из ibm
operate(fd, sadr);
}
else {
(void)close(fd); // добавил по примеру из ibm
}
}
Полегчало сильно - больше таких сокетов не висит совсем.Спасибо за помощь.