![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ClienSocket и ServerSocket [D6, WinXP]
serko © (2006-01-27 00:03:00)Вот у меня одна прога типа сервер а другая клиент!
Естественно что Клиент подключается к уже запущенному Серверу.
Но вот если запустить клиента когда сервер еще не запущен то выскакивает ошибка "Asynchronous socket error 10061".
Как сделать так чтобы Клиент подключался до тех пор пока не запустится Сервер, без вывода этой ошибки?
Сергей М. (2006-03-23 08:10:00) [1]
> Fandros © (22.03.06 19:37) [68]
> использование таймера на форме - не подходит
Ничто не мешает создать таймер "не на форме".
Да и форма собственно ни при чем - твой "сильно подправленный компонент или специальный класс" тоже может не иметь к форме никакого отношения.
Fandros (2006-03-22 19:37:00) [2]
> Задача такая: Основное это управлять КЛИЕНТским компом и
> приложением. Хотелось бы что это происходило так: КЛИЕНТская
> прога запускаеся и ждет подключения сервера; если сервер
> отключился то она снова переходит в режим "Попытки подключения"
> (не хочется чтобы всегда была запущена СЕРВЕРная прога),
> у меня при отключенном сервере через некоторое время у
> клиента выскакивает ошибка! А при запуске серверной программы
> в LISTVIEW должен появляться список подключенны клиентов,
> ну и обновляться при подключении\отключении КЛИЕНТа. Вот
> здесь у меня возникают проблемки, в остальном думаю разберусь!
>
У меня примерно такая-же задача, но клиент должен находиться в сильно подправленной компоненте или в специальном классе! Поэтому использование таймерана форме - не подходит! Как можно заставить переконектиться клиенту (при мягком отрубе сервера)???
обработчик OnDisconnect не игнорирует команду ClientSocket.Open;
serko (2006-03-21 22:20:00) [3]Ты знаеш все пока работает - ПОЛЕТ нормальный!
ЕЩе раз спасибо!
serko (2006-03-20 13:42:00) [4]Попробуем еще так! Спасибо!
Сергей М. (2006-03-20 09:08:00) [5]
> serko © (17.03.06 23:01) [64]
> я закрываю СЕРВЕР
Если это сделано штатно (ServerSocket.Close), то у клиента возникнет событие OnDisconnect, в обработчике которого можно запустить таймер.
serko (2006-03-17 23:01:00) [6]Всеравно ниче не получается!
в таймере пишу:
ClientSocket1.Open;
Timer1.Enabled:=false;
а в OnError:
Errorcode:=0;
Socket.Close;
Timer1.enabled:=true;
и Вот что получается: Когда запустился КЛИЕНТ, произошло соединение и таймер выключился. Но когда я закрываю СЕРВЕР и снова его запускаю то уже connect не происходит (таймер то остановлен, и OnError выполняется).
Как симитировать ошибку? Или мож еще что подскажеш?
serko (2006-03-16 23:53:00) [7]Отето ответ и я понимаю! все бы так отвечали!
Спасибо, тебе, попробую сделать правильный вывод!
Сергей М. (2006-03-16 08:58:00) [8]
> serko © (15.03.06 16:50) [60]
> точного числа не добивался
Ну какая-то закономерность хоть наблюдается ?
> буфер маленький
Суть ошибки (10055 WSAENOBUFS) заключается в слишком большом кол-ве созданных тобой гнезд в клиентском приложении.
Создание нового гнезда происходит всякийраз при выполнении метода TClientSocket.Open, а уничтожение - при выполнении TCustomWinSocket.Close или TCustomWinSocket.Disconnect(хендл гнезда).
Успешный вызов метода TClientSocket.Open (т.е. вызов не приведший к исключению) в неблок.режиме нельзяинтерпретировать как факт успешного установления соединения - об этом тебя известит асинхронное событие OnConnect. Начинать прием/передачу следует не ранее чем возникнет это событие.
После вызова TClientSocket.Open вместо события OnConnect может возникнуть событие OnError, говорящее о невозможности установки соединения с сервером по тем или иным причинам. Детальная инф-ция об этой причине передается параметром ErrorCode в обработчик события OnError. Кроме того, событие OnError может возникнуть и позже, уже после события OnConnect, в этом случае оно говорит об ошибках в ходе приема/передачи, например, о неожиданном разрыве соединения со стороны сервера в момент когда была инициирована асинхронная операция чтения/записи.
В любом случае в OnError можно (а в случае ошибки, связанной с невозможностью установления коннекта - обязательно) выполнить метод Socket.Close (Socket в дан.случае - это параметр, переданный в обработчик OnError, а не ClientSocket !), что приведет к безусловному уничтожению созданного ранее при вызове ClientSocket.Open гнезда, если оно еще не уничтожено на этот момент. После этого , если необходимо, можно проанализировать ErrorCode на предмет дальнейших действий и сбросить его в 0, чтобы не "выскочило" окно асинхронного сообщения об ошибке.
Далее по ходу выполнения обработчика OnError, если необходимо повторить попытку коннекта, можно активизировать таймер, в обработчике которого собственно выполнить ClientSocket.Open и тут же деактивировать таймер.
Slavjanin (2006-03-15 21:10:00) [9]Здраствуйте, предложите пожалуйста мне исходник сканера портов, или дайте ссылку. Спасибо
serko (2006-03-15 16:50:00) [10]
> В обработчике КАКОГО события сервера ты это делаешь ?
> Это же крайне важно ...
Та я токо не делал! и в Onread просто по нажатию кнопки, точного числа не добивался!
> Значит ты неверно обрабатываешь OnError
Ну а как надо обрабатывать шоб ошибка не вылазила?
Дело в том шо у меня дома скоко бы не стояла ошибка не вылазит, а на др. компе Win 98 и видимо буфер маленький вот и вылазит такая ошибка!
Сергей М. (2006-03-15 12:57:00) [11]
> serko © (15.03.06 12:52) [58]
> кинул Label а на него ServerSocket1.SocketActiveConnections
В обработчике КАКОГО события сервера ты это делаешь ?
Это же крайне важно ...
> 10055 WSAENOBUFS
Значит ты неверно обрабатываешь OnError
serko (2006-03-15 12:52:00) [12]
> Не бывает такого.
Ну если бы не было такого я бы не говорил. Я взял и проверил - кинул Label а на него ServerSocket1.SocketActiveConnections. И почти всегда показывает больше чем есть, только иногда реальное число!
> Что такое "долгий дисконнект" ? Какие конкретно ошибки ?
Читай внимательнее ранние посты.
Ну если я закрыл СЕРВЕР, то клиент находится в Disconnect. Так вот если он в Diconnect находится 1 мин, то все ок а если допустим минут 15, то выскакивают такие ошибки:
"10055 WSAENOBUFS No buffer space available (Закончились буферы).
Невозможно осуществить операцию с сокетом, поскольку системе не хватает буферного пространства или переполнена очередь. Это означает, что WinSock временно не хватает буфров."
Как их избежать?
Сергей М. (2006-03-15 09:24:00) [13]
> serko © (15.03.06 01:29) [56]
> выскакиваю ошибки при долгом дисконекте
Что такое "долгий дисконнект" ? Какие конкретно ошибки ?
> Почему ServerSocket1.SocketActiveConnections иногда бывает
> больше реального числа самих ClientSocket?
Не бывает такого.
serko (2006-03-15 01:29:00) [14]Вопрос: "У КЛИЕНТА выскакиваю ошибки при долгом дисконекте!" остается в силе!
И еще: "Почему ServerSocket1.SocketActiveConnections иногда бывает больше реального числа самих ClientSocket? Как лишние принудительно отключить?"
serko (2006-03-10 22:27:00) [15]Сделал! При запуске ошибка вроде не выскакивает!
Но у КЛИЕНТА ошибки все таки выскакиваю при долгом дисконекте!
serko (2006-03-07 23:41:00) [16]
> Сергей М. © (07.03.06 08:45) [53]
Тут я с тобой полностью согласен, я просто сделал как было в статье. Думаеш это разрешит мою проблему?
Тогда в сообщении нужно осылать ИМЯ подключенного или отключенного клиента и потом его добавлять или искать и удалять из ListView?
P.S.Но ведь когда я отсылал те или иные сообщения для ВСЕХ клиентов, тоже глюки были!
Сергей М. (2006-03-07 08:45:00) [17]А зачем всякий раз при акцепте или дисконнекте некоего очередного клиента запрашивать у остальных активных клиентов их имена ? Они что, измениться разве могут ?
И зачем чистить ListView при этом ?
serko (2006-03-06 21:13:00) [18]Ну у меня OnAccept и OnDisconnect использует одну процедуру ServerSocket1Accept т.к. коды там одинаковы!
Сергей М. (2006-03-06 13:05:00) [19]Начнем по порядку ..
> procedure TForm1.ServerSocket1Accept(Sender: TObject;
> Socket: TCustomWinSocket);
> var i: Integer;
> begin
> {Кто-то присоединился или отсоединился?
Причем здесь "отсоединился" ?
Accept-событие фиксирует факт подтверждения сервером клиентского запроса на соединение
serko (2006-03-03 23:37:00) [20]
> Это все в локальной сети должно работать ?
Так точно!