![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TServerSocket - Опрос запущеных серверов [D3, Win95/98, WinME, WinXP]
Mishel © (2002-07-24 15:33:00)Дано: В локальной сети на клиентских компах запускается задача, которая является сервером. Получаем несколько (заранее не известно на каких именно компах) запущенных копий программы.
Необходимо: Определить на каких именно компах запущена прогрмма.
Попытка решения: Нахожу все включенные компы в локалке (70-110 штук), получаю их имена и IP адреса. Пытаюсь перебирать весь список т.е. через TClientSocket пытаюсь последовательно соединиться с каждым компом (Сервером) из полученного списка. По идее если соединение проходит успешно - получаю ответ от сервера.
Тип соединения ctNonBlocking. Похоже из-за асинхронного режима в простом цикле не успевает происходить соединение даже с компом где сервер точно запущен (в пошаговом режиме - таже беда).
Может я вообще что-то не то делаю т.е. может есть возможность послать запрос сразу всем компам, а потом собрать пришедшие ответы? Хотя в дальнейшем будет необходимо определенным найденным серверам отсылать комманду т.е. все-таки нужно перебирать список - подключиться, послать комманду, принять ответ, отсоединиться...
Какие будут предложения, пожелания, напутствия?
romychk (2002-09-30 12:24:00) [1]Mishel у меня таже проблема, если у тебя получилось, скажи как?
Mishel (2002-07-31 15:15:00) [2]>sedoy
По подробнее, если можно (я в сетях - дуб)
Пытаюсь использовать компонент TUDP, отсылка UDP1.SendData( ).
Какие значания нужно задать для свойств
LocalPort, RemoteHost, RemotePort - чтобы запрос пошел на всю локалку?
Ругается что нет таких адресов на локальной машине LocalPort, RemotePort забивал,
RemoteHost - ставил и 255.255.255.255 и свой IP и IP других реальных машин в сети.
Получать данные UDP1.GetData( X,Y ) - тип X : OleVariant; а Y ? Предлагается vbString, vbArray, vbByte - а чему они реально равны?
Плиз с кусочком кода...
Jo (2002-07-31 07:54:00) [3]to Sedoy:
Как адрес broadcast узнать?
sedoy (2002-07-30 16:59:00) [4]зачем морока с циклом ???
при запуске посылай UDP-запрос в сеть.
если на компьютере запущена программа - она поймает запрос и по обратному адресу вышлет ответ(только отсылать нужно уже по сокету, а не udp). не нужно циклов с определением компьютеров, обработкой соединений и т.п. В ответе можешь выслать всю информацию о клиенте, какая тебе нужна.
Digitman (2002-07-30 16:30:00) [5]Не нравится - используй режим ctBlocking
Mishel (2002-07-30 16:17:00) [6]>Digitman
Спасибо, что ткнул носом на обработчики событий - вроде заработало...
>Ksion
Дисконект стоял. Я сам недоглядел - надо было в OnError() обнулять код ошибки.
>All
Короче на событиях - заработало, а если в цикле типа FOR, не пашет, очевидно из-за того, что необходимо время на установку соединения, посылку сообщения, а цикл лупит дальше.
Т.е. устанавливаю соединение -> посылаю сообщение-> принимаю ответ ->отсоединяюсь -> пытаюсь соединиться со след.компом.
Получается, что отсоединение "гасит" прием-передачу. Через события работает, но получается очень громоздко. Вообще по большому счету мне нужно послать на комп запрос и если есть моя запущенная прога, она должна вернуть мне ответ. Может это можно реализовать вообще без применения Сокетов?
Ksion (2002-07-27 07:28:00) [7]Попробовал вариант по событиям - строю цепочку
беру первый комп из списка - пытаюсь соединиться -
если соединился (OnConnect())
посылаю запрос,
принимаю ответ,
закрываю соединение,
попытка соединения со след. компом
иначе (неудачное соединение OnError())
попытка соединения со след. компом
После опработки OnError() вылетает с ошибкой
Asynchronous socket error 10061 - тоже, что и если делаю опрос не через события а в цикле...
Попробуй перед началом цикла вставить Дисконект
zarem (2002-07-26 18:42:00) [8]Mishel не мог бы ты обьяснить как ты получаешь список ip компьютеров в сети? заранее спасибо
Digitman (2002-07-25 10:49:00) [9]Что значит - "не через события а в цикле" ?
Я тебе про фому, ты мне - про ерему) ...
Перечитай еще раз внимательно Digitman © (24.07.02 15:45)
А в цикле ты чего-то там делаешь или не в линейно - суть от этого неизменна
Mishel (2002-07-25 09:57:00) [10]Mishel -> Digitman:
Попробовал вариант по событиям - строю цепочку
беру первый комп из списка - пытаюсь соединиться -
если соединился (OnConnect())
посылаю запрос,
принимаю ответ,
закрываю соединение,
попытка соединения со след. компом
иначе (неудачное соединение OnError())
попытка соединения со след. компом
После опработки OnError() вылетает с ошибкой
Asynchronous socket error 10061 - тоже, что и если делаю опрос не через события а в цикле...
Mishel -> YouNick:
Полностью согласен, это для меня проще писать прогу и администрировать, и примеры подобной организации нарыл.
только как всегда есть НО!
Это я в нашем подразделении настрою сервак для запуска на нем серверной части,
а в нашем ОАО еще 26 заводов и на 14 крутится задача. Организация сетей - на каждом своя за всеми не уследишь... Самый простой вариант - поробовать сделать систему именно без центрального сервера по типу чата (пример Vypress Chat).
YouNick (2002-07-24 16:50:00) [11]не совсем понятна технология ...
Странно организованно взаимодействие. Может лучше было б сделать один сервер и куча клиентов. клиенты и искали бы этот единственный сервер. По-моему все будет гораздо проще.
Digitman (2002-07-24 15:45:00) [12]В данном случае :
Фактом успешного коннекта явл-ся событие OnConnect()
Фактом отказа явл-ся событие OnError()
Разве это не определяет однозначно условия обнаружения искомого сервиса в сети ? Цикл-то здесь ни при чем, каким бы он ни был - важно не игнорировать эти события...