Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 912

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

Вопрос: Как правильно завершить работу сервера, если он имеет подключенных клиентов?

Приложение:
  1.  
  2.  


Roman Novikov Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Roman Novikov (статус: Посетитель)
Вопрос отправлен: 15 июня 2009, 01:39
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 19; последнее сообщение — 12 июля 2009, 16:49; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 15 июня 2009, 01:52 [#1]:

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

А вот почему зависло приложение... скорее всего какой то из потоков ждет чего то. Надо смотреть архитектуру.
Галочка "подтверждения прочтения" - вселенское зло.
Death_Master

Death_Master (статус: Посетитель), 15 июня 2009, 02:26 [#2]:

Можно просто отослать сообщение клиентам с причиной дисконнекта, а у клиента при получении этого сообщения поставить отключение от сервера на 30 сек, после отсылки всем подождать 5 сек(на всякий случай, вдруг где-то пинги по 5000)...
потом просто прибить все потоки и завершить прогу :)
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Roman Novikov

Roman Novikov (статус: Посетитель), 15 июня 2009, 15:34 [#3]:

Ну может сузествует функция которая просто обрубает на сервере сокеты и прерывает поток обслуживания подключений?

"А вот почему зависло приложение... скорее всего какой то из потоков ждет чего то. Надо смотреть архитектуру."
Из потоков в нем только основной поток приложения и потоки самого компонента которы открываются самостоятельно при подключении клиентов и закрываются после отключения.
Roman Novikov

Roman Novikov (статус: Посетитель), 15 июня 2009, 15:36 [#4]:

Death_Master, клиентов может быть большое количество... правильно конечно им сообщить, что надо разъединиться и они сами вызовут disconnect, но если нет времени ждать, то как прибить потоки?
Вадим К

Вадим К (статус: Академик), 15 июня 2009, 16:20 [#5]:

Потоки прибивать не надо. они сами должны умирать. А вот если вызывать функции типа TerminateThread, то они конечно убивают тред, но... это как откручивание колес у машины, которая едет на скорости километоров сто в час с целью остановить её.
Галочка "подтверждения прочтения" - вселенское зло.
Roman Novikov

Roman Novikov (статус: Посетитель), 15 июня 2009, 19:08 [#6]:

что же тогда делать, если нужно выключить сервер?
Death_Master

Death_Master (статус: Посетитель), 15 июня 2009, 19:18 [#7]:

Если нужно СРОЧНО выключить сервер, то только прибивать потоки...
Если выключать нужно корректно, тогда всем отправить сообщение об отключении, а потом прибить потоки (те, к кому сообщение могло не дойти за 5-10 секунд)...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Вадим К

Вадим К (статус: Академик), 15 июня 2009, 19:20 [#8]:

никто не мешает ничего клиентам не отсылать, а просто сам факт дистоннекта - и будет сигналом.
Галочка "подтверждения прочтения" - вселенское зло.
Death_Master

Death_Master (статус: Посетитель), 15 июня 2009, 19:32 [#9]:

Насколько я помню при UDP можно ждать пакета довольно долго....
И сам факт отключения клиент воспримет не сразу....
Но я могу и ошибаться...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Roman Novikov

Roman Novikov (статус: Посетитель), 15 июня 2009, 20:04 [#10]:

Вадим К, а как со стороны сервера вызвать дисконнект? Я просто не нашел нужного мне метода.(Допустим что клиент проверяет статус подключения через пинг или другим способом)
Death_Master

Death_Master (статус: Посетитель), 15 июня 2009, 20:25 [#11]:

Если есть возможность, то дайте хоть какие-то данные по протоколу работы(можно дать приблизительно)!
например протокол TCP сообщения вида число(тип сообщения),данные ... или команда(текст), данные....
или вообще через UDP или TCP в виде постоянного потока пакетов или маркированных сегментов....
Просто протоколы программ могут очень различаться по модели поведения как сервера, так и клиента....
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Вадим К

Вадим К (статус: Академик), 15 июня 2009, 20:39 [#12]:

Как сделать дисконект? закрыть сокет. А вот как именно закрывается сокет в Вашем случае - я без понятия, я не знаю какими компонентами пользуетесь, как код организован.

UDP - это протокол без установки соединения. В нем гарантируется только что пакет придет или нет. Но вот ни порядок пакетов, ни скорость прихода не гарантируется. Более того, потеря пакета в UDP - нормальная ситуация. Но не потеря половины пакета.
Галочка "подтверждения прочтения" - вселенское зло.
Death_Master

Death_Master (статус: Посетитель), 15 июня 2009, 21:25 [#13]:

Т.к. не описано что и как- ждём автора вопроса :)
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Roman Novikov

Roman Novikov (статус: Посетитель), 15 июня 2009, 22:09 [#14]:

Вопрос относится к тому же серверу что в другм моем вопросе. Используются TIdTCPServer и TIdTCPСlient из Indy10. Простенький сервер, к которому подключаются клиенты и передают сообщения. Даже после закрытия сокетов на сервере он завис.
Вадим К

Вадим К (статус: Академик), 15 июня 2009, 22:22 [#15]:

Я кода сервера не видел. там может быть WaitFor, или критическая сессия, которая ждет неведомо чего.
Галочка "подтверждения прочтения" - вселенское зло.
Death_Master

Death_Master (статус: Посетитель), 16 июня 2009, 00:28 [#16]:

А можно сразу номер вопроса, чтоб хоть посмотреть? :)
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Roman Novikov

Roman Novikov (статус: Посетитель), 22 июня 2009, 08:40 [#17]:

Вопрос # 2 898
Последняя запись
Roman Novikov

Roman Novikov (статус: Посетитель), 12 июля 2009, 14:25 [#18]:

Есть варианты? Как закрыть соединения на сервере? Мне нужны строчки кода, а клиенты пусть обрабатывают факт дисконнекта.
Death_Master

Death_Master (статус: Посетитель), 12 июля 2009, 16:49 [#19]:

procedure ForceTCPServerDeactivation(var AServer : TIdTCPServer);
var
List : TList;
idx : integer;
begin
List := AServer.Threads.LockList;
try
for idx := 0 to List.Count - 1 do
begin
try
TIdPeerThread(List.Items[idx]).Connection.Disconnect;
except
on E: Exception do
begin
TIdPeerThread(List.Items[idx]).Stop;
end;
end;
end;
finally
AServer.Threads.UnlockList;
end;
//Sleep is needed else d/c Timeout exceptions will occur (multithreading)
Sleep(500);
{[2006/09/08] Tsusai - Reduced to 500 miliseconds, from 5 whole ones
it does work on my server, not sure on a whole bunch of them}
AServer.Active := false;
AServer.Bindings.Clear;
end;
P.S. код я нашел, а не писал сам....
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.02 сек.