![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Про TServerSocket & TClientSocket [D6, WinXP]
-=RUST=- © (2005-01-19 20:54:00)У меня после первого моего знакомства с этими компонентами воникла пара вопросов, а именно:
1. При потере соединения TServerSocket с одним из своих TClientSocket возбуждается исключение хотя в событии onError TServerSocket-а прописано закрыть сокет.
2. При потере связи TClientSocket с сервером, после закрытия приложения сервера, этот клиент выругается грязными словами в виде сообщения об ошибке, а когда сервер опять заработает клиент связь не востанавливает (пробовал в дисконект указать ему периодически пытаться восстановить связь не помогло)
Подскажите товарищи пожалуйсто чё тут поделать
Ksandr (2005-01-27 07:23:00) [1]Попробовал установить...
Вот что выдал:
One or more the types in the assembly unable to load.
Не принимает. Что делать? Старый Инди из делфи я удалил. Только он был не 9 версии, а 10-ой. 10.00.17
А новый версии 10.00.53
Eraser (2005-01-26 15:41:00) [2]Ksandr
В делфи 8 урезанная поставка Indy, притом 9 версии.
Иди на сайт http://www.indyproject.org/и качай полуню бесплатную 10 версию.
Перед тем как устанавливать, ПОЛНОСТЬЮ сотри предыдущую.
Ksandr (2005-01-26 11:48:00) [3]Кстати, про Инди... А как им пользоваться. Я в Delphi 8 не нашел сервера Инди. Есть только клиент. Может кто расскажет?
Digitman (2005-01-26 08:28:00) [4]
> Так вот когда клиент внезапно обрубаеться (типа у компа
> резет нажали :) у сервера возникает событие OnClientError
а если клиент на "другом конце Интернет" ?
> мучаюсь с отправкой файла
бедняга)
Ksandr (2005-01-26 06:25:00) [5]Ща вот сижу и тоже делаю сетевую программу на Socket-ах.
Так вот когда клиент внезапно обрубаеться (типа у компа резет нажали :) у сервера возникает событие OnClientError и тут все просто: закрываем сокет и обнуляем код ошибки.
Когда же сервер обрубается подобным образом, то у клиента происходит событие OnError? в котором также просто закрываем сокет и обнуляем код ошибки.
Теперь, чтобы клиент восстановил связь с сервером при включении оного, надо в момент ошибки в клиенте запускать таймер с интервалом к примеру в 5 секунд. И в этом таймере вызывать метод Open. Так как событие OnError у нас уже описано, то никто ругаться не будет, а клиент будет долбиться на сервер до тех пор, пока не подключится или пока его самого не выключат.
Народ, это все пустяки. Я тут мучаюсь с отправкой файла. Кто может пообщаться на эту тему? Мой номер ICQ 170387055
Digitman (2005-01-22 13:00:00) [6]
> Дармидон (22.01.05 12:17) [19]
> во-вторых - таких ошибок нет
какихошибок ?
на основании чего ты утверждаешь, что код компонентов TServerSocket & TClientSocket содержит какие-то там ошибки ?
Дармидон (2005-01-22 12:17:00) [7]Используйте ICS. Во-первых - открытие исходники, во-вторых - таких ошибок нет.
Digitman (2005-01-22 12:00:00) [8]
> -=RUST=- © (22.01.05 00:17) [17]
> А как на счет востановлении связи клиента с сервером после
> временного отключения сервера?
ну как ? обычным образом - ClientSocket.Open или ClientSocket.Active := True
только не забывай, что в non-blocking-режиме успешный (т.е. не приведший к исключению) вызов Open или Active НЕ говорит об успешной установке соединения, а говорит о старте операции установления коннекта с сервером .. об успешности ее сообщит событие OnConnect, а о неуспешности - OnError .. в случае неуспешности в обработчике OnError обязательноследует написать как минимум Socket.Close
-=RUST=- (2005-01-22 00:17:00) [9]Ааа, ну убедил, спасибо за объяснение. (А то знакомство то мое первое с этими компонентами)
А как на счет востановлении связи клиента с сервером после временного отключения сервера?
Digitman (2005-01-21 14:11:00) [10]
> -=RUST=- © (21.01.05 13:50) [14]
нет паришь !
сначала ты говоришь
> Сервер выдает ошибку сразу как выключается клиент на удаленной
> тачке
а теперь, выясняется, что сервер все же ДЕЛАЕТ send-вызов, именно после чего собссно и происходит возбуждение события-ошибки
и именно так и должно быть !
отсутствие исключения при вызове send-метода НЕ говорит о том, что указанные тобой данные по завершению метода УЖЕ находятся на стороне приемника ... успешное выполнение send-метода говорит лишь отом , что указанные тобой к передаче данные успешно поставлены в очередь на передачу ... в асинхронном режиме передача очереди является отложенной (pending) операцией, и об ее успехе говорит событие On(Client)Write, а об ее отказе - событие On(Client)Error .. отказ же как раз и м.б. связан с тем фактом, что приемник при приеме данных на своей стороне неожиданно закрыл соединение по своей инициативе, о чем и говорит, кстати, код ошибки 10053
-=RUST=- (2005-01-21 13:52:00) [11]kaZaNoVa
на счет апи было бы интересно посмотреть
-=RUST=- (2005-01-21 13:50:00) [12]>Digitman: ты мозги нат тут не парь.
>если на стороне сервера нет ни единого вызова send- или receive- метода, то данный отказ ни когда не возникнет.
А я не парю, на сервере есть вызовы метода send, и я не говорил что их там нет,но ошибка обнаруживалась не в момент его(метода) выполнения а как я уже сказал "сразу как выключается клиент на удаленной тачке"
ErrorCode:=0 всё ясно, и с клиентом тоже самое да? (всмысле чтоб при потере связи с сервером клиент периодически пытается её востановить)
Sapersky (2005-01-21 12:15:00) [13]Сервер выдает ошибку сразу как выключается клиент на удаленной тачке 'Asunhronus socket error 10053'
Насколько я понял (была подобная проблема), это "нормальное" поведение сокетов... Можно эту ошибку просто игнорировать (ErrorCode:=0), т.к. далее должен сработать OnClientDisconnect (что и требуется в данном случае).
Digitman (2005-01-21 08:15:00) [14]
> kaZaNoVa © (20.01.05 22:07) [11]
> предлагаю Апи-сокеты, могу дать пример
да весь scktcomp.pas - сплошной готовый пример "Апи-сокетов" !
ты что-то новое изобрел в этом плане ?
kaZaNoVa (2005-01-20 22:07:00) [15]Digitman © (20.01.05 17:17) [6]
я, как всегда, предлагаю Апи-сокеты, могу дать пример ....
Eraser (2005-01-20 21:36:00) [16]Verg ©
Я не знаю, а догаадываюсь. Свои догадки я высказал. При таком количестве данных ничего больше сказать не могу. Если автору вопроса интересно- пусть уточнит.
Verg (2005-01-20 20:19:00) [17]
> Всмысле не компонента, а инизциализация компонентом winsock.
> Видимо проблема с блокирующим/неблокирующим режимом.
Ну, ну, хорошо,... пусть так. Так где конкретно "плохость" инициализации и каким образом это сказывается именно на возникновение исключений типа 'Asunhronus socket error 10053' и что же конкретно там сделано плохо в этом ключе? Вы же об этом говорите (об этой плохости), значит - знаете...
Нет, ну интересно было бы послушать, просто.
Eraser (2005-01-20 20:05:00) [18]Verg ©
Digitman ©
Всмысле не компонента, а инизциализация компонентом winsock. Видимо проблема с блокирующим/неблокирующим режимом.
ЗЫ: Заметье, это вы про Indy первыми начали.
Verg (2005-01-20 17:37:00) [19]
> Eraser © (20.01.05 17:03) [5]
> 'Asunhronus socket error 10053'
> А всё виновата плохая инициализация компонента...
А конкретнее? Где и в чем "плохая"? В контесте данных, конкретных "компонент".
Аргументируйте свои слова - думаю для Вас это будет несложно.
P.S.
Мне бы уже давно осточертело "висеть на дороге" рекламным щитом с натписью "Indy - НАФСИГДА!!!"
Digitman (2005-01-20 17:17:00) [20]
> виновата плохая инициализация компонента
дурь.
> Советую использовать другие компоненты или чистый API
а что еще от Eraser'а ожидать ? сейчас начнет со своим Инди аки курица с яйцом носиться).. якобы Инди - панацея ото всех бед)