Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

ServerSocket обрыв соединения?   Найти похожие ветки 

 
Valerik   (2004-04-20 23:03) [0]

Каким событием отловить в данном компоненте обрыв соединения
(например физический)?


 
Rouse_ ©   (2004-04-21 00:09) [1]

Каково соедиение? Режим гнезда? ...


 
Digitman ©   (2004-04-21 08:55) [2]


> например физический


физический  - никаким


 
Valerik   (2004-04-21 09:09) [3]

Вообщем на одном компе стоит ServerSocket, на другом ClientSocket
при выдергивании шнура из сетевой карты по событиям ServerSocket1ClientError и ServerSocket1ClientDisconnect ничего не отлавливается. (????) В то же время на клиенте срабатывает событие ClientSocket1Error.
Если на сервере отключить программно сетевую карту то работает событие ServerSocket1ClientError.


 
Digitman ©   (2004-04-21 10:03) [4]


> по событиям ServerSocket1ClientError и ServerSocket1ClientDisconnect
> ничего не отлавливается. (????)


не должно и не будет "отлавливаться"


> В то же время на клиенте срабатывает событие ClientSocket1Error


если клиент полключился и "молчит", то и этого события ты не получишь


> Если на сервере отключить программно сетевую карту то работает
> событие ServerSocket1ClientError


но если сервер "молчит", у клиента никакие события не возникунут

суть проста - события на той или иной стороне соединения возникают не сами по себе, они есть реакция на получение TCP/IP-пакетов ... если же произошел физ.отказ транспортного канала, ожидающая транспортных событий сторона не получит никаких пакетов (а откуда они, спрашивается, возьмутся, если "шнурок выдернут" ?) и, соответственно, не возбудит никакие события

для таких целей в самом простом случае следует реализовать т.н. программный KeepAlive-механизм.. каждая из сторон соединения ведет таймер, подсчитывающий время прошедшее с момента последнего произошедшего события On[Client]Read.. если это время превышает некий порог ожидания, партнеру посылается некое контрольное сообщение, мол, "ты жив или мертв ?" ... партнер, в принципе, может и не отвечать на это сообщение ... но при вызове любого Send-метода, если в трансп.канале произошел некий отказ, будет либо немедленно возбуждено исключение ESocketConnectionError либо через некот.время возникнет событие On[Client]Error .. обе ситуации следует рассматривать как критические (очевидная невозможность дальнейшего инф.обмена по  установленному с партнером соединению) и тут же вызывается Close-метод для отказавшего гнезда


 
Valerik   (2004-04-21 12:15) [5]

Спасибо


 
Григорьев Антон   (2004-04-21 12:21) [6]

Про TServerSocket не скажу, не работал с ним, но программировал сокеты на уровне API. И могу точно сказать, что серверный сокет, не совершающий никаких активных действий, очень долго не получает никакой информации о потере связи. Иногда - минут 10, иногда - до получаса. Надо просто подождать.


 
Digitman ©   (2004-04-21 12:38) [7]


> Надо просто подождать


ну да, конечно... ждать до морковкиного заговения, до второго пришествия)

чего ждать-то, скажи на милость ? канал-то физически разорван уже, ничего с "того конца" уже не пооступит и ждать пока "пробъет" где-то что-то - попросту бессмысленно .. если есть подозрения, что за прошедшие, к примеру, 10 миним от партнера должно было что-то прийти (имеется ввиду - по ЕГО, партнера, инициативе), а партнер молчит, то нечего ждать, следует проявить инициативу самому, послав хоть что-нибудь партнеру ... и нештатный разрыв трансп.канала, если он действительно имел место быть,  обязательно "просигналит" либо исключением либо событием On[Client]Error


 
Verg ©   (2004-04-21 13:15) [8]

Сокету можно установить опцию SO_KEEPALIVE, тогда после некоторого времени молчания в этом соединении, ядро будет проверять целостность соединения отправками специальных сегментов TCP (keepalive probe).
Интервал этот достаточно большой (около двух часов), но все же он конечен.

В winsock2 появилась, кстати, новая "фишка":

SIO_KEEPALIVE_VALS
Enables the per-connection setting of keep-alive option, keepalive time, and keepalive interval. The argument structure for SIO_KEEPALIVE_VALS is as follows:
/* Argument structure for SIO_KEEPALIVE_VALS */
struct tcp_keepalive {
   u_long  onoff;
   u_long  keepalivetime;
   u_long  keepaliveinterval;
};


 
Тимохов ©   (2004-04-21 13:26) [9]

Это было в rsdn #1 2004 про определение разрыва ip соединения.
Меня только удивили слова автора (Андрей Елсуков) - "в MSDN очень скупо это все описано ... если кто-то лучше осведомлен, буду раз выслушать пояснения".


 
Григорьев Антон   (2004-04-21 13:52) [10]


> Digitman ©   (21.04.04 12:38) [7]
>
> > Надо просто подождать
>
>
> ну да, конечно... ждать до морковкиного заговения, до второго
> пришествия)
>
> чего ждать-то, скажи на милость ? канал-то физически разорван
> уже, ничего с "того конца" уже не пооступит и ждать пока
> "пробъет" где-то что-то - попросту бессмысленно .. если
> есть подозрения, что за прошедшие, к примеру, 10 миним от
> партнера должно было что-то прийти (имеется ввиду - по ЕГО,
> партнера, инициативе), а партнер молчит, то нечего ждать,
> следует проявить инициативу самому, послав хоть что-нибудь
> партнеру ... и нештатный разрыв трансп.канала, если он действительно
> имел место быть,  обязательно "просигналит" либо исключением
> либо событием On[Client]Error


Это, конечно, хорошо, когда что-то можно послать партнёру, но не все протоколы допускают это. Мне приходилось реализовывать протоколы, в которых сервер не имел права отправлять клиенту что-либо по собственной инициативе. Так что приходилось сидеть и ждать. А что ещё делать-то?


 
Digitman ©   (2004-04-21 16:27) [11]


> Мне приходилось реализовывать протоколы, в которых сервер
> не имел права отправлять клиенту что-либо по собственной
> инициативе


странный ты какой-то) .. ты собственноручно разрабатываешь протокол, и при этом не в состоянии предусмотреть такие права для сервера (ну и как следствие - адекватную реакцию клиента на то, что ему в соответствии с твоим же протоколом заранее известно)


> А что ещё делать-то?


как что ? протокол твой ? твой) ... клиент-сервер (даже если они не твои собственные) обязаны поддерживать какую-то конкретную версию протокола ? обязаны) ... доработай его с учетом KeepAlive-механизма и доработай сервер и клиент с учетом изменений протокола в этой части ... либо извести сторонних разработчиков об изменениях в новой версии твоего протокола  - дальше уже их проблема, поддержать новый протокол или плюнуть на это дело ..

все ! какие сложности-то ?



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.022 c
14-1085815415
Mad Dancer
2004-05-29 11:23
2004.06.13
Колосоккер


3-1085245603
GGREED
2004-05-22 21:06
2004.06.13
DBGrid(PickList)


8-1081078391
NV-VETAL
2004-04-04 15:33
2004.06.13
Сравнение произнесенной речи. Помогите!


8-1081016008
Forelli
2004-04-03 22:13
2004.06.13
Как вызвать Windows кую настройку громкости


14-1085206385
AlexG
2004-05-22 10:13
2004.06.13
Intel и AMD.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский