Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно определить разорванное TCP соедине  (Прочитано 11296 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sss
Специалист

ru
Offline Offline

« : 04-07-2003 04:40 » 

Страна просыпайся !!! (GMT +7 блин)
Подскажите, как правильно определить разорванное TCP соединение (WinSock) не нагружая потоки receiver-ов тестовыми пакетами.
Я вылавливаю пакеты нулевой длины и считаю что теперь пора кончать. Однако иногда их НЕТ (аварийные ситуации без shutdown(...) и/или CloseSocket(...) ).
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 04-07-2003 06:46 » 

Никак по сути.
соединение должно жить пока не сработатет одно условие - обычный тайм-аут.
Обычно 60 секунд.
Записан

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #2 : 04-07-2003 07:52 » 

Цитата: Гром
Никак по сути.
соединение должно жить пока не сработатет одно условие - обычный тайм-аут.
Обычно 60 секунд.


Это значит приемная и передающая сторона должны договариваться об тайм-ауте, плюс receiver-у не поспать не просыпаясь. Наверное я слишком много ем. Привычка от 80386. Все приходилось экономить. Спасибо, закроем эту гиблую тему. Ага
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 04-07-2003 09:21 » 

Нет - на всамом деле никакого договора нет - если у любой стороны не было активности его партнера в течении 60 секунд - вызывать можно closesocket и все.

Таким образом - если с той стороны комп подвис или связь оборвалась ты закроешь свой дескриптор окета и освободишь место - ресурсы не будут повисать.
Записан

А птичку нашу прошу не обижать!!!
awolf
Гость
« Ответ #4 : 04-07-2003 13:45 » new

Вообще-то есть варианты отследживания разрыва TCP-связи.
Первый - в настройках TCP-стека устанавливаются KeepAlive параметры с маленьким промежутком времени тестирования канала. После открытия сокета ему устанавливается опция KEEP_ALIVE (кип-эливы используются для выкупания физического разрыва).

Дальше контроль разрыва контролируется опрашиванием сокета с помощью 2-х функций select и recv (c опцией PEEK). Этот прием реализован в библиотеке Simple Socket Library в функциях Swait, Stimeoutwait. В этом случае лучше использовать неблокированные сокеты.
Записан
awolf
Гость
« Ответ #5 : 04-07-2003 13:53 » 

Simple Socket Library мона найти тута -> http://www.erols.com/astronaut/ssl

Ниже реализация функции Stimeoutwait (кастрированный вариант)
Она возвращает EOF в случае определения разрыва соединения.

int Stimeoutwait(Socket *skt,long seconds,long useconds)
{
short          result;
int            ret;
fd_set         emask;
fd_set         rmask;
fd_set         wmask;
struct timeval timeout;
static char    buf[PM_BIGBUF];


/* sanity check */
if(!skt) {
   return -1;
   }

FD_ZERO(&rmask);
FD_SET(skt->skt,&rmask);
FD_ZERO(&wmask);
FD_ZERO(&emask);

/* test if something is available for reading on the socket.  This form
 * will block (sleep) until something arrives
 */
timeout.tv_sec = seconds;
timeout.tv_usec= useconds;

result= select(skt->skt+1, &rmask,&wmask,&emask, &timeout);

/* socket error */
if(result < 0) {
   return -1;
   }

/* timed out */
else if(result == 0) {
    return -2;
    }

if(FD_ISSET(skt->skt,&rmask)) {
   ret= recv(skt->skt,buf,PM_BIGBUF-1,MSG_PEEK);
   if(result == 1 && ret == 0) ret= EOF;
   if (ret == SOCKET_ERROR) ret= EOF;
   return ret;
   }

/* socket is empty */
return 0;
}
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines