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

Вниз

Список всех подключившихся к серваку idTCPServer   Найти похожие ветки 

 
banderas ©   (2004-07-18 15:39) [0]

Как мне по средствам idTCPServer"a вывести допустим в memo1 список всех подключившихся
Athread.Connection.Socket.Binding.PeerIP ? но как узнать когда этот клиент отконектится ?


 
Reindeer Moss Eater ©   (2004-07-19 16:19) [1]

но как узнать когда этот клиент отконектится ?
Хороший вопрос.
Первым делом так и тянет ответить - спроси у самого клиента.
А как быть в случае когда сам клиент не знает когда он отконнектится?
И отконнектится ли вообще.


 
alienserg   (2004-07-19 19:28) [2]

banderas ©   (18.07.04 15:39)

TCP не имеет встроенных средств обнаружения внезапного обрыва коннекта.
Обычно клиент периодически шлет серверу сообщения "Im"alive, don"t kill me"
Период посылки keep alive сообщения может быть адаптивным. Чем дольше Idle на стороне клиента, тем реже посылка.
Дело же сервера - регулярно опрашивать в отдельном треде треды клиентов и если молчание клиента превышает некий предел, то что-то делать с мертвым клиентом.
Можно это дело организовать и на стороне сервера. Тогда сервер будет регулярно опрашивать клиента на предмет досягаемости.
Но в любом случае программист это должен делать сам, ручками.


 
Anatoly Podgoretsky ©   (2004-07-19 20:03) [3]

alienserg   (19.07.04 19:28) [2]
Ты не понял, он хочет узнать когда клиент думает отсоединиться.


 
VID ©   (2004-07-19 22:57) [4]

alienserg   (19.07.04 19:28) [2]
Сервер не должен спрашивать у клиента "Жива ли ты ещё, старушка?". Это исключительно забота клиента, говорить что "Жива". А сервер для каждого клиента заводит переменную LastActivity(или как хошь назови):Cardinal куда записывает значение GetTickCount при каждой активности (отправке данных) со стороны клиента. Также в сервере должен быть реализован сервисный поток, в котором будет постоянно сканироваться весь список клиентов. И если будет обнаружен клинт, где GetTickCount - его LastActivity > X (X, время в мс. после которого клиента надо отключить), отключаем его нафиг.

В ситуации, если клиент залогинился на сервер (уникальный логин и пароль) и вдруг внезапно отключился (сервер думает что клиент ещё подключён), и естесно задумал заново приконектится, то:
1. При подключении сервер создаст для этого клиента поток.
2. При прохождении клиентом процедуры аутентификации (логин и пароль, если вообще требуется), сервер убьёт тот старый поток, с логином и пасом этого клиента.


 
alienserg   (2004-07-20 01:30) [5]

VID ©   (19.07.04 22:57) [4]
Сервер не должен...
Ну во-первых то, что ты предлагаешь, в точности повторяет первый вариант, который я упомянул.
Я же не говорил "опрашивать клиента", я сказал "сервер в отдельном треде опрашивает _треды_ клиентов". К треду клиента как правило прикручена структура данных клиента. И в ней та самая переменная, о которой ты говоришь.
Она не обязательно должна быть Cardinal, такие строгости ни к чему :) Сойдет и TDateTime.
Ее и проверяем.

Во-вторых вполне можно напрячься и придумать, чтобы сам сервер проверял коннект на внезапный обрыв. Нельзя говорить "сервер должен". В какой-то реализации "дожен", в какой-то нет. Лично я пользую первый вариант, когда _клиент_ посылает keep alive сообщения, поскольку он удобнее на мой взгляд. Но не исключаю и второго... Жизнь многообразна.


 
VID ©   (2004-07-20 15:57) [6]

Ну вообще то в Cardinal должна храниться "та самая переменная" потому что GetTickCount возвращает значение этого типа, а если ты будешь хранить значение LastActivity как TDateTime то, что подумает твой сервер если вдруг на компе внезапно время переведут на час вперёд ? Правильно, поотрубает нафиг все. А GetTickCount фиг кто изменит.

А так, конечно, никто ничего не обязан, можно даже что бы ни клиент ин сервер не проверял "is connection alive ?" :)

В-общем, и ты и я правы :)



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

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

Наверх




Память: 0.46 MB
Время: 0.032 c
3-1093979991
Morrison
2004-08-31 23:19
2004.09.26
Как узнать значение autoincrement поля без ApplyUpdates?


3-1093628825
Vemer
2004-08-27 21:47
2004.09.26
Как правильно отцепить Master - Dataset?


3-1093847388
Pyton
2004-08-30 10:29
2004.09.26
ODBC. Программно создать системный DSN.


14-1094474342
Shiza
2004-09-06 16:39
2004.09.26
В чём проблема с компом?


3-1093534913
a3a3ello
2004-08-26 19:41
2004.09.26
Запрос SQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский