Собственно проблема такая:
Написал прогу которая на висит Х поре. Как только к ней подключаются она запускает экземпляр демона читает сообщение и рвёт соединение. всё вроде хорошо, вот только периодически возникает такая проблема - клиент подключился, кинул сообщение и остаётся висеть "на линии".
#netstat показывает что на этом порту висит клиент.
если даже killall этого демона, всё равно висит.
через какой-нибудь (всегда по разному) промежуток времени клиент отваливается.
Рву соединение так:
shutdown(fd, 2);
close(fd);
после чего:
exit(0);Экземпляр демона убивается, зомбиков нет.
Ни кто не сталкивался с подобной ситуацией?
Все сталкиваются. Это нормально. Проблема то в чем?
Этот параметр настраивается в атрибутах сокета, не помню правда где. посмотри man tcp
это сделано для защиты от атак, по умолчанию у меня стоит 60 сек. параметр tcp_fin_timeout
>это сделано для защиты от атак, по умолчанию у меня стоит 60
>сек. параметр tcp_fin_timeoutСпасибо огромное за разъяснения)
Может ещё подскажете, если соект открылся клиентом и клиент ничего туда не шлёт, как его закрыть, скажем, секунд через 10? Таймер писать?
Лучше select с timeout.
>Лучше select с timeout.Можно подробнее?
man 2 select, там есть даже пример. На всякий случай, если у вас в мане его нет,то привожу здесь:ПРИМЕР
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval;/* Ждем, пока на стандартном вводе (fd 0) что-нибудь
появится. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Ждем не больше пяти секунд. */
tv.tv_sec = 5;
tv.tv_usec = 0;retval = select(1, &rfds, NULL, NULL, &tv);
/* Не полагаемся на значение tv! */if (retval)
printf("Данные доступны.\n");
/* Теперь FD_ISSET(0, &rfds) вернет истинное значение. */
else
printf("Данные не появились в течение пяти секунд.\n");exit(0);
}