URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7608
[ Назад ]

Исходное сообщение
"Помогите с сокетами"

Отправлено LXD , 26-Сен-08 17:54 
Собственно проблема такая:
Написал прогу которая на висит Х поре. Как только к ней подключаются она запускает экземпляр демона читает сообщение и рвёт соединение. всё вроде хорошо, вот только периодически возникает такая проблема - клиент подключился, кинул сообщение и остаётся висеть "на линии".
#netstat показывает что на этом порту висит клиент.
если даже killall этого демона, всё равно висит.
через какой-нибудь (всегда по разному) промежуток времени клиент отваливается.
Рву соединение так:
shutdown(fd, 2);
close(fd);
после чего:  
exit(0);

Экземпляр демона убивается, зомбиков нет.

Ни кто не сталкивался с подобной ситуацией?


Содержание

Сообщения в этом обсуждении
"Помогите с сокетами"
Отправлено MakMen , 26-Сен-08 20:08 
Все сталкиваются. Это нормально. Проблема то в чем?
Этот параметр настраивается в атрибутах сокета, не помню правда где. посмотри man tcp


"Помогите с сокетами"
Отправлено MakMen , 26-Сен-08 20:12 
это сделано для защиты от атак, по умолчанию у меня стоит 60 сек. параметр tcp_fin_timeout


"Помогите с сокетами"
Отправлено LXD , 27-Сен-08 16:17 
>это сделано для защиты от атак, по умолчанию у меня стоит 60
>сек. параметр tcp_fin_timeout

Спасибо огромное за разъяснения)

Может ещё подскажете, если соект открылся клиентом и клиент ничего туда не шлёт, как его закрыть, скажем, секунд через 10? Таймер писать?


"Помогите с сокетами"
Отправлено angra , 27-Сен-08 16:23 
Лучше select с timeout.

"Помогите с сокетами"
Отправлено LXD , 28-Сен-08 19:04 
>Лучше select с timeout.

Можно подробнее?


"Помогите с сокетами"
Отправлено angra , 29-Сен-08 19:19 
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);
       }