|
Вопрос # 2 912/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Вопрос: Как правильно завершить работу сервера, если он имеет подключенных клиентов?
 |
Вопрос задал: Roman Novikov (статус: Посетитель)
Вопрос отправлен: 15 июня 2009, 01:39
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 19; последнее сообщение — 12 июля 2009, 16:49; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 15 июня 2009, 01:52 [#1]:
Во первых, на клиенте не надо ставить серверный компонент (иногда это невозможно), никто не мешает серверу отправить по тому же каналу сообщение о том, что нужно завершить подключение.
Во вторых, "закрыть крестиком" - приложение оконное? обычно сервера "оконными" не бывает. И очень часто останавливать серверную часть редко бывает необходимым и часто достаточно просто "прибить" (более того, большая часто серверов так и работает). Клиенты при этом отключаются просто по факту дисконнекта.
А вот почему зависло приложение... скорее всего какой то из потоков ждет чего то. Надо смотреть архитектуру.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Death_Master (статус: Посетитель), 15 июня 2009, 02:26 [#2]:
Можно просто отослать сообщение клиентам с причиной дисконнекта, а у клиента при получении этого сообщения поставить отключение от сервера на 30 сек, после отсылки всем подождать 5 сек(на всякий случай, вдруг где-то пинги по 5000)...
потом просто прибить все потоки и завершить прогу
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Roman Novikov (статус: Посетитель), 15 июня 2009, 15:34 [#3]:
Ну может сузествует функция которая просто обрубает на сервере сокеты и прерывает поток обслуживания подключений?
"А вот почему зависло приложение... скорее всего какой то из потоков ждет чего то. Надо смотреть архитектуру."
Из потоков в нем только основной поток приложения и потоки самого компонента которы открываются самостоятельно при подключении клиентов и закрываются после отключения.
|
|
Roman Novikov (статус: Посетитель), 15 июня 2009, 15:36 [#4]:
Death_Master, клиентов может быть большое количество... правильно конечно им сообщить, что надо разъединиться и они сами вызовут disconnect, но если нет времени ждать, то как прибить потоки?
|
|
Вадим К (статус: Академик), 15 июня 2009, 16:20 [#5]:
Потоки прибивать не надо. они сами должны умирать. А вот если вызывать функции типа TerminateThread, то они конечно убивают тред, но... это как откручивание колес у машины, которая едет на скорости километоров сто в час с целью остановить её.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Roman Novikov (статус: Посетитель), 15 июня 2009, 19:08 [#6]:
что же тогда делать, если нужно выключить сервер?
|
|
Death_Master (статус: Посетитель), 15 июня 2009, 19:18 [#7]:
Если нужно СРОЧНО выключить сервер, то только прибивать потоки...
Если выключать нужно корректно, тогда всем отправить сообщение об отключении, а потом прибить потоки (те, к кому сообщение могло не дойти за 5-10 секунд)...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Вадим К (статус: Академик), 15 июня 2009, 19:20 [#8]:
никто не мешает ничего клиентам не отсылать, а просто сам факт дистоннекта - и будет сигналом.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Death_Master (статус: Посетитель), 15 июня 2009, 19:32 [#9]:
Насколько я помню при UDP можно ждать пакета довольно долго....
И сам факт отключения клиент воспримет не сразу....
Но я могу и ошибаться...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Roman Novikov (статус: Посетитель), 15 июня 2009, 20:04 [#10]:
Вадим К, а как со стороны сервера вызвать дисконнект? Я просто не нашел нужного мне метода.(Допустим что клиент проверяет статус подключения через пинг или другим способом)
|
|
Death_Master (статус: Посетитель), 15 июня 2009, 20:25 [#11]:
Если есть возможность, то дайте хоть какие-то данные по протоколу работы(можно дать приблизительно)!
например протокол TCP сообщения вида число(тип сообщения),данные ... или команда(текст), данные....
или вообще через UDP или TCP в виде постоянного потока пакетов или маркированных сегментов....
Просто протоколы программ могут очень различаться по модели поведения как сервера, так и клиента....
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Вадим К (статус: Академик), 15 июня 2009, 20:39 [#12]:
Как сделать дисконект? закрыть сокет. А вот как именно закрывается сокет в Вашем случае - я без понятия, я не знаю какими компонентами пользуетесь, как код организован.
UDP - это протокол без установки соединения. В нем гарантируется только что пакет придет или нет. Но вот ни порядок пакетов, ни скорость прихода не гарантируется. Более того, потеря пакета в UDP - нормальная ситуация. Но не потеря половины пакета.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Death_Master (статус: Посетитель), 15 июня 2009, 21:25 [#13]:
Т.к. не описано что и как- ждём автора вопроса
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Roman Novikov (статус: Посетитель), 15 июня 2009, 22:09 [#14]:
Вопрос относится к тому же серверу что в другм моем вопросе. Используются TIdTCPServer и TIdTCPСlient из Indy10. Простенький сервер, к которому подключаются клиенты и передают сообщения. Даже после закрытия сокетов на сервере он завис.
|
|
Вадим К (статус: Академик), 15 июня 2009, 22:22 [#15]:
Я кода сервера не видел. там может быть WaitFor, или критическая сессия, которая ждет неведомо чего.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Death_Master (статус: Посетитель), 16 июня 2009, 00:28 [#16]:
А можно сразу номер вопроса, чтоб хоть посмотреть?
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Roman Novikov (статус: Посетитель), 22 июня 2009, 08:40 [#17]:
Вопрос # 2 898
Последняя запись
|
|
Roman Novikov (статус: Посетитель), 12 июля 2009, 14:25 [#18]:
Есть варианты? Как закрыть соединения на сервере? Мне нужны строчки кода, а клиенты пусть обрабатывают факт дисконнекта.
|
|
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!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|