Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TServerSocket ошибка 10053, Ошибка при разрыве соединения 
V
    Опции темы
dimokx87
  Дата 22.4.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



Помогите пожалуйста!
Использую компонент TServerSocket, подключаются несколько клиентов, всё отлично работает. Но если выключить один из клиентов не разъединив соединение (например через диспетчер задач), то на сервере вылетает ошибка 10053, при этом сервер думает, что тот клиент ещё подключен. Что нужно сделать? smile 
PM MAIL   Вверх
Демо
Дата 22.4.2010, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



Цитата(dimokx87 @  22.4.2010,  12:55 Найти цитируемый пост)
Что нужно сделать?


Ну видимо просто обработать эту ошибку (WSAECONNABORTED (10053))?



--------------------
    
PM MAIL ICQ Skype   Вверх
dimokx87
Дата 22.4.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



Подскажи пожалуйста как это сделать.
PM MAIL   Вверх
kami
Дата 22.4.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Минимальный обработчик события OnError на серверном и клиентском сокете должен состоять из:
Код

ErrorCode:=0;
Socket.Close;

PM MAIL WWW   Вверх
dimokx87
Дата 22.4.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



ErrorCode:=0; это у меня и так стоит, а Socket.Close; мне не нужно. Мне нужно, чтобы список пользователей обновился.
PM MAIL   Вверх
kami
Дата 22.4.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(dimokx87 @  22.4.2010,  19:05 Найти цитируемый пост)
а Socket.Close; мне не нужно. 

Тогда без комментариев.
Только не удивляйтесь, что пошли утечки.

При "неправильном" разрыве соединения (прерывание процесса, разрыв соединения с помощью TCPView) "второму концу" это не сообщается. И узнает он о том, что соединение уже не живое только при попытке что-либо отправить в сокет. Именно в этот момент возникнет ошибка, которая должна быть обработана в OnError. Если ошибка все равно "вылезает", значит она не обработана, ибо исключение при ErrorCode=0 не возникает.
Код

    Error(Self, ErrorEvent, ErrorCode);
    if ErrorCode <> 0 then
      raise ESocketError.CreateResFmt(@sASyncSocketError, [ErrorCode]);


В догонку - при ошибке соединения его нужно закрыть установленным порядком.
PM MAIL WWW   Вверх
dimokx87
Дата 22.4.2010, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



Не могу понять. Значит закрытие сокета обязательно и придётся очистить список подсоединенных клиентов, а потом подключать всех заново?
PM MAIL   Вверх
kami
Дата 22.4.2010, 21:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(dimokx87 @  22.4.2010,  21:00 Найти цитируемый пост)
Значит закрытие сокета обязательно и придётся очистить список подсоединенных клиентов, а потом подключать всех заново?

Видимо, Вы не правильно понимаете основы работы компонентов TClient|TServerSocket.
Команда Socket.Close, вызванная в одном из обработчиков событий этих компонентов приведет только к закрытию соединения, инициировавшего это событие. Говоря более простым языком - закроется только одно из соединений с клиентами. Только то, которое инициировало событие. На остальные соединения это никак не повлияет.
Не нужно путать ServerSocket.Socket, который является слушающим сокетом с ServerSocket.Socket.Connections[i], которые являются активными сокетами, обслуживающими только свои соединения. В события компонентов передается именно один из ServerSocket.Socket.Connections[i]
PM MAIL WWW   Вверх
dimokx87
Дата 22.4.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



Всё работает!!! smile 
ОГРОМНОЕ спасибо kami!
Как я понял Socket.Close вызывает выполнение disconect.
PM MAIL   Вверх
kami
Дата 22.4.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(dimokx87 @  22.4.2010,  21:30 Найти цитируемый пост)
Всё работает!!!

 smile 
отлично.
(мысли в слух: оно могло начать работать еще в 17:46 smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.