Форум: "Сети";
Текущий архив: 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.026 c