Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Список всех подключившихся к серваку idTCPServer [D7, WinXP]


banderas ©   (2004-07-18 15:39:00) 

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


VID   (2004-07-20 15:57:00) [1]

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

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

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


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

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

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


VID   (2004-07-19 22:57:00) [3]

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

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


Anatoly Podgoretsky   (2004-07-19 20:03:00) [4]

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


alienserg   (2004-07-19 19:28:00) [5]

banderas ©   (18.07.04 15:39)

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


Reindeer Moss Eater   (2004-07-19 16:19:00) [6]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо