Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.21;
Скачать: CL | DM;

Вниз

Поиск устройства   Найти похожие ветки 

 
Rentgen ©   (2006-01-24 08:33) [0]

Всем привет!

Есть устройство(ADAM-6060) подключенное к локальной сети. Есть драйвер для работы с этим устройством. И конечно нужно подключить ADAM из своего программного продукта :)

Проблема в том, что не всегда известен IP адрес адама. Можно ли как то "найти" его в сети?

Коннект через драйвер:

function ADAMTCP_Connect(szIP:PChar; port:WORD;
                     iConnectionTimeout:Integer;
                     iSendTimeout:Integer; iReceiveTimeout:Integer):Integer; StdCall;


...PS...
К устройству прилагается утилитка, которая без особых проблем находит искомый девайс(секунд 20-30).

Неужели она перебирает все адреса в подмаске сети?

Буду признателен за любую помощь!!!


 
Digitman ©   (2006-01-24 08:45) [1]


> Неужели она перебирает все адреса в подмаске сети?


Судя по "секунд 20-30" можно предположить что именно так ..

Вряд ли потребовалось столько времени на обнаружение устр-ва, если бы утилитка могла  посылать UDP-бродкаст-запросы "Ты где, устройство ?", а устр-во соответственно умело отвечать на них "Я здесь !"


 
Anatoly Podgoretsky ©   (2006-01-24 09:09) [2]

Rentgen ©   (24.01.06 08:33)  
А как же иначе, раз адрес неизвестен, хоть порт то фиксированый, иначе просто вешайся.
Связывайся с разработчиками на предмет протокола и организовывай опрос или используй их утилитку.


 
Rentgen ©   (2006-01-24 09:12) [3]

Пробовал я перебором. Какие то 255 адресов перебор занимет 3(!) минуты.


Procedure TfrmMain.Search(B1, B2, B3, B4, E1, E2, E3, E4:Byte);
var
L1,L2,L3,L4:Byte;
iRetVal:Integer;
begin
iRetVal:=ADAMTCP_Open;
for L1:=B1 to E1 do
begin
 for L2:=B2 to E2 do
 begin
  for L3:=B3 to E3 do
  begin
   for L4:=B4 to E4 do
   begin
     IP:=IntToStr(L1)+"."+IntToStr(L2)+"."+IntToStr(L3)+"."+IntToStr(L4);
      Label1.Caption:=IP;
       Application.ProcessMessages;
      iRetVal := ADAMTCP_Connect(PChar(IP),502, 500, 200, 200);
     if iRetVal>=0 then ListBox1.Items.Add(IP);
    end; //4
  end; //3
 end; //2
end; //1
end;


Что то делаю не так?


 
Rentgen ©   (2006-01-24 09:13) [4]

благо порт фиксированый.


 
Digitman ©   (2006-01-24 09:17) [5]


> Какие то 255 адресов перебор занимет 3(!) минуты


ну правильно !

iConnectionTimeout у тебя равен 500 (миллисекунд, я так понимаю)

255 * 0,5 сек - это уже больше 2-х минут !


 
Digitman ©   (2006-01-24 09:20) [6]

К тому же, насколько я понял, в сети присутствует всего одно устройство.
Если так, то при нахождении устр-ва нужно тут же выходить изо всех циклов, а не продолжать бессмысленно перебирать адреса, по которым устр-ва заведомо нет.


 
Rentgen ©   (2006-01-24 09:30) [7]


> Digitman ©   (24.01.06 09:20) [6]
>
> К тому же, насколько я понял, в сети присутствует всего
> одно устройство.
> Если так, то при нахождении устр-ва нужно тут же выходить
> изо всех циклов, а не продолжать бессмысленно перебирать
> адреса, по которым устр-ва заведомо нет.


Полностью согласен. Но это всего лишь случайность...
PS.
А можно узнать, что как правило, возращает функция UDP броадкаст?
...
Дело в том, что в драйвере есть фунции:

function  ADAMTCP_UDPOpen(iSendTimeout:Integer; iReceiveTimeout:Integer):Integer; stdcall

function  ADAMTCP_UDPClose:Integer; StdCall;

function  ADAMTCP_SendReceiveUDPCmd( szIP:PChar; szSend:PChar; szReceive:PChar):Integer; StdCall;


Но как я их не крутил, они мне не помогли в поиске.


 
Digitman ©   (2006-01-24 09:35) [8]


> можно узнать, что как правило, возращает функция UDP броадкаст?


Судя по приведенным прототипам бродкаст-режим твоим драйвером не реализован.


 
Rouse_ ©   (2006-01-24 10:46) [9]

Здается мне, что если порт известен, то на нем открыт сокет в режиме прослушки, тогда можно просто попытаться произвести попытку соединения на этот порт через обычный winsock, если попытка успешна - вызывать уже родную АПИ драйвера.


 
Rentgen ©   (2006-01-24 12:23) [10]

Пытаюсь воспользоваться советом
> Rouse_ ©   (24.01.06 10:46) [9]


Использую цикл как и в [3], а тело:
//cs1 это компонент TClientSocket с ADAMовским портом
 
 if cs1.Active=true  then cs1.Active:=false;
 cs1.Host:=IP;
 if cs1.Active=false then cs1.Active:=true;
 sleep(500);
 

Далее в событии csConnect пытаюсь соедениться с ADAMом, но
вылетает ощибка "Asynchronous socket error 10049". Хотя сдается мне, что дело не в ADAMе


 
Rouse_ ©   (2006-01-24 12:31) [11]


> вылетает ощибка "Asynchronous socket error 10049".

Значит на этом порте нет сервера.


 
Slym ©   (2006-01-24 13:06) [12]

Rentgen ©   (24.01.06 9:12) [3]
Пробовал я перебором. Какие то 255 адресов перебор занимет 3(!) минуты.

Сканировать в несколько потоков...
10 потоков займут - 255/10 * 0,5 сек = 12.75 сек



Страницы: 1 вся ветка

Текущий архив: 2006.05.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.04 c
3-1143974013
Alex Romanskiy
2006-04-02 14:33
2006.05.21
Out парметры в ХП MySQL


15-1145965134
mctarik
2006-04-25 15:38
2006.05.21
Опрос!!! Кодинг или Копирование чюжих исходников


1-1144911936
Alexandr
2006-04-13 11:05
2006.05.21
перезапуск программы


2-1146332817
Express
2006-04-29 21:46
2006.05.21
ADOCommand – как перейти на следующую запись???


3-1143547506
Vitasha
2006-03-28 16:05
2006.05.21
Настройка репликаций в Informix