Форум: "Сети";
Текущий архив: 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.05 c