Форум: "Сети";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизTServerSocket - Опрос запущеных серверов Найти похожие ветки
← →
Mishel (2002-07-24 15:33) [0]Дано: В локальной сети на клиентских компах запускается задача, которая является сервером. Получаем несколько (заранее не известно на каких именно компах) запущенных копий программы.
Необходимо: Определить на каких именно компах запущена прогрмма.
Попытка решения: Нахожу все включенные компы в локалке (70-110 штук), получаю их имена и IP адреса. Пытаюсь перебирать весь список т.е. через TClientSocket пытаюсь последовательно соединиться с каждым компом (Сервером) из полученного списка. По идее если соединение проходит успешно - получаю ответ от сервера.
Тип соединения ctNonBlocking. Похоже из-за асинхронного режима в простом цикле не успевает происходить соединение даже с компом где сервер точно запущен (в пошаговом режиме - таже беда).
Может я вообще что-то не то делаю т.е. может есть возможность послать запрос сразу всем компам, а потом собрать пришедшие ответы? Хотя в дальнейшем будет необходимо определенным найденным серверам отсылать комманду т.е. все-таки нужно перебирать список - подключиться, послать комманду, принять ответ, отсоединиться...
Какие будут предложения, пожелания, напутствия?
← →
Digitman (2002-07-24 15:45) [1]В данном случае :
Фактом успешного коннекта явл-ся событие OnConnect()
Фактом отказа явл-ся событие OnError()
Разве это не определяет однозначно условия обнаружения искомого сервиса в сети ? Цикл-то здесь ни при чем, каким бы он ни был - важно не игнорировать эти события...
← →
YouNick (2002-07-24 16:50) [2]не совсем понятна технология ...
Странно организованно взаимодействие. Может лучше было б сделать один сервер и куча клиентов. клиенты и искали бы этот единственный сервер. По-моему все будет гораздо проще.
← →
Mishel (2002-07-25 09:57) [3]Mishel -> Digitman:
Попробовал вариант по событиям - строю цепочку
беру первый комп из списка - пытаюсь соединиться -
если соединился (OnConnect())
посылаю запрос,
принимаю ответ,
закрываю соединение,
попытка соединения со след. компом
иначе (неудачное соединение OnError())
попытка соединения со след. компом
После опработки OnError() вылетает с ошибкой
Asynchronous socket error 10061 - тоже, что и если делаю опрос не через события а в цикле...
Mishel -> YouNick:
Полностью согласен, это для меня проще писать прогу и администрировать, и примеры подобной организации нарыл.
только как всегда есть НО!
Это я в нашем подразделении настрою сервак для запуска на нем серверной части,
а в нашем ОАО еще 26 заводов и на 14 крутится задача. Организация сетей - на каждом своя за всеми не уследишь... Самый простой вариант - поробовать сделать систему именно без центрального сервера по типу чата (пример Vypress Chat).
← →
Digitman (2002-07-25 10:49) [4]Что значит - "не через события а в цикле" ?
Я тебе про фому, ты мне - про ерему) ...
Перечитай еще раз внимательно Digitman © (24.07.02 15:45)
А в цикле ты чего-то там делаешь или не в линейно - суть от этого неизменна
← →
zarem (2002-07-26 18:42) [5]Mishel не мог бы ты обьяснить как ты получаешь список ip компьютеров в сети? заранее спасибо
← →
Ksion (2002-07-27 07:28) [6]Попробовал вариант по событиям - строю цепочку
беру первый комп из списка - пытаюсь соединиться -
если соединился (OnConnect())
посылаю запрос,
принимаю ответ,
закрываю соединение,
попытка соединения со след. компом
иначе (неудачное соединение OnError())
попытка соединения со след. компом
После опработки OnError() вылетает с ошибкой
Asynchronous socket error 10061 - тоже, что и если делаю опрос не через события а в цикле...
Попробуй перед началом цикла вставить Дисконект
← →
Mishel (2002-07-30 16:17) [7]>Digitman
Спасибо, что ткнул носом на обработчики событий - вроде заработало...
>Ksion
Дисконект стоял. Я сам недоглядел - надо было в OnError() обнулять код ошибки.
>All
Короче на событиях - заработало, а если в цикле типа FOR, не пашет, очевидно из-за того, что необходимо время на установку соединения, посылку сообщения, а цикл лупит дальше.
Т.е. устанавливаю соединение -> посылаю сообщение-> принимаю ответ ->отсоединяюсь -> пытаюсь соединиться со след.компом.
Получается, что отсоединение "гасит" прием-передачу. Через события работает, но получается очень громоздко. Вообще по большому счету мне нужно послать на комп запрос и если есть моя запущенная прога, она должна вернуть мне ответ. Может это можно реализовать вообще без применения Сокетов?
← →
Digitman (2002-07-30 16:30) [8]Не нравится - используй режим ctBlocking
← →
sedoy (2002-07-30 16:59) [9]зачем морока с циклом ???
при запуске посылай UDP-запрос в сеть.
если на компьютере запущена программа - она поймает запрос и по обратному адресу вышлет ответ(только отсылать нужно уже по сокету, а не udp). не нужно циклов с определением компьютеров, обработкой соединений и т.п. В ответе можешь выслать всю информацию о клиенте, какая тебе нужна.
← →
Jo (2002-07-31 07:54) [10]to Sedoy:
Как адрес broadcast узнать?
← →
Mishel (2002-07-31 15:15) [11]>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 - а чему они реально равны?
Плиз с кусочком кода...
← →
romychk (2002-09-30 12:24) [12]Mishel у меня таже проблема, если у тебя получилось, скажи как?
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c