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

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

TIdTCPServer, TIdTCPClient


Анонимщик ©   (2004-04-14 01:10:00) 

У сервера есть метод OnDisconnect. Я так понимаю, событие срабатывает, когда клиент отваливается? Что-то не выходит. Помогите начинающему.


Anvar Turakulov   (2004-04-21 09:40:00) [1]

Удалено модератором
Примечание: Последний раз повторяю. Задай свопрос в своей ветке и в ней же и жди ответа. Незачем мусорить в других...


Verg   (2004-04-14 09:56:00) [2]

Если говорить именно про сервер (TIdTCPServer), событие OnDisconnect возникает, когда поток созданый этим компонентом для обработки входящего клиентского подключения обнаруживает разрыв соединения.
Обнаружить это он может только если при исполнении (OnExecute) он вызывает методы Read**, Write** и т.п. прямо или косвенно.

Т.е., например, если в OnExecute делать так:

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
 sleep(10);
end;

то никакого OnDisconnect никогда не произойдет. Мало того поток связанный с этим соединением так и будет продолжать работать, даже если сам клиент уже давным давно отсоединился.

Блокирующие сокеты сами по-себе никому ничего не сообщают.
С ними надо "общаться", чтобы узнать о их состоянии.

Предыдущий пример заменим на

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
 AThread.Connection.ReadFromStack(false, 100, false);
end;


Rouse_   (2004-04-14 09:38:00) [3]

> [8] Erik ©   (14.04.04 09:36)
Это ж тебе не UDP...


Erik   (2004-04-14 09:36:00) [4]

А еще можно логически подумать, если клиент долго неотвечает, то можно послать ему тестовый пакет. Нет ответа значить отвалился.


Digitman   (2004-04-14 08:28:00) [5]


> Анонимщик


чем плохи TServerSocket/TClientSocket ? imho, ничем .. асинхронный режим оба поддерживают .. совершенно прозрачный транспортный механизм .. простота и наглядность .. никаких излишеств ..


Анонимщик   (2004-04-14 03:10:00) [6]

Тогда тебе спасибо.


Rouse_   (2004-04-14 02:13:00) [7]

Тут я плохой советчик, так как пользуюсь исключительно WinSock, думаю Verg или Digitman будут более компетентны...


Анонимщик   (2004-04-14 02:02:00) [8]

Черт побери. Извини, я действительно редко сокетами занимаюсь. Мне ведь действительно асинхронный режим нужен.
Чем посоветуешь воспользоваться?


Rouse_   (2004-04-14 01:57:00) [9]

Ну давай думать логически - id предназначен дл совместимости с Linux стало быть Асинхронка тебе заказана :)
На сколько я помню работает все это в блокирующем режиме стало быть событий не ищи - вывод?
Вспоминаем как работают сокеты в данном состоянии, вот там и найдешь решение проблемы...


Анонимщик   (2004-04-14 01:35:00) [10]

А как поймать отваливание?


Rouse_   (2004-04-14 01:25:00) [11]

Ну насколько я помню данное событие происходит не когда клиент "отваливается", а когда он выполняет соответствующий метод...


Наверх

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