Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск устройства [D7, WinXP]


Rentgen ©   (2006-01-24 08:33:00) 

Всем привет!

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

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

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

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


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

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

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


Slym   (2006-01-24 13:06:00) [1]

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

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


Rouse_   (2006-01-24 12:31:00) [2]


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

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


Rentgen   (2006-01-24 12:23:00) [3]

Пытаюсь воспользоваться советом
> 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 10:46:00) [4]

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


Digitman   (2006-01-24 09:35:00) [5]


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


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


Rentgen   (2006-01-24 09:30:00) [6]


> 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:20:00) [7]

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


Digitman   (2006-01-24 09:17:00) [8]


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


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

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

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


Rentgen   (2006-01-24 09:13:00) [9]

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


Rentgen   (2006-01-24 09:12:00) [10]

Пробовал я перебором. Какие то 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;


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


Anatoly Podgoretsky   (2006-01-24 09:09:00) [11]

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


Digitman   (2006-01-24 08:45:00) [12]


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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо