![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск устройства [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-бродкаст-запросы "Ты где, устройство ?", а устр-во соответственно умело отвечать на них "Я здесь !"