Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1145709316
ArtemESC
2006-04-22 16:35
2006.05.21
Счетчик времени на сайте...


15-1145565199
Tirael
2006-04-21 00:33
2006.05.21
триллиан, вставка из буфера


2-1146659381
Wood
2006-05-03 16:29
2006.05.21
Info для приложения.


15-1146057540
rolex2002
2006-04-26 17:19
2006.05.21
Как удалить системные точки восстановления?


4-1140892068
spokoistvie
2006-02-25 21:27
2006.05.21
TextViewer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский