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

Вниз

Получить имя NetBIOS   Найти похожие ветки 

 
charoey_mag   (2009-01-22 15:52) [0]

Использую функцию так:
gethostbyaddr(@Addr, SizeOf(Addr), AF_NETBIOS);
или так
gethostbyaddr(@Addr, SizeOf(Addr), AF_INET);

Результаты одинаковые. Часть имен имя компа, а часть имя компа.домен.
Я так понимаю что имя компа.домен возвращает DNS сервер, так?
Можно ли запретить использование DNS в функции gethostbyaddr?


 
Сергей М. ©   (2009-01-22 15:58) [1]


> а часть имя компа.домен


В домене нет имен компов, там имена хостов.


 
charoey_mag   (2009-01-23 08:43) [2]

На сколько я понимаю имена хостов хранящиеся на сервере как в AD так и в DNS это локальные имена компьютеров. Эта фукнция !видимо! возвращает имена из запроса в разные службы, а кто первый ответит тот и прав.

И соответственно мне надо получить локальные имена не используя DNS и AD. Как?


 
Сергей М. ©   (2009-01-23 09:04) [3]

http://www.windowsfaq.ru/content/view/121/57/
http://rouse.drkb.ru/network.php (см. nbtstat.zip)


 
charoey_mag   (2009-01-23 10:16) [4]


> http://rouse.drkb.ru/network.php (см. nbtstat.zip)

То что надо, огромное спасибо.

Но, как всегда есть это ... но.
Вот код

function GetNetBiosNames(const Addr: String):string;
var
 NCB: TNCB;
 Enum: TLanaEnum;
 NetbiosInfo: TNetbiosInfo;
 I, A: Integer;
 Ends: Byte;
 fq1:boolean;
begin
 result:="";
 FillChar(NCB, SizeOf(TNCB), #0);
 NCB.ncb_command := Char(NCBENUM);
 NCB.ncb_buffer := @Enum;
 NCB.ncb_length := SizeOf(TLanaEnum);
 if Netbios(@NCB) = Char(NRC_GOODRET) then  <=============стр. 2
   for I := 0 to Integer(Enum.length) - 1 do
   begin
     FillChar(NCB, SizeOf(TNCB), #0);
     NCB.ncb_lana_num := Enum.lana[I];
     NCB.ncb_command := Char(NCBRESET);
     if Netbios(@NCB) = Char(NRC_GOODRET) then
     begin
       FillChar(NetbiosInfo, SizeOf(TNetbiosInfo), #0);
       NCB.ncb_command := Char(NCBASTAT);
       Move(Addr[1], NCB.ncb_callname[0], Length(Addr));
       NCB.ncb_buffer := @NetbiosInfo;
       NCB.ncb_length := SizeOf(TNetbiosInfo);
       fq1:=false;
       if Netbios(@NCB) = Char(NRC_GOODRET) then
         for A := 0 to NetbiosInfo.AdapterStatus.name_count - 1 do
         begin
           Ends := Byte(NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1]);
           if Ends=$20 then
             begin
             NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1] := #32;
             result:=String(NetbiosInfo.NameBuffer[A].name);
             fq1:=true;
             end;
         end;
       result:=result;    <================стр. 1
       if fq1=false then
         result:=result;
     end;
   end;
end;

Мне нужен только 1 параметр, я добавляю свою переменную fq1. НО!!!!
без сторки "стр. 1"(любой ничего не делающей команды) в "стр. 2" ответ на Netbios = $07("illegal buffer address").
Что это????

PS. Это только у меня for считает задом наперед и соответственно переворачивает значения в массивах??


 
Сергей М. ©   (2009-01-23 10:35) [5]



function GetNetBiosNames(const Addr: String):string;
type
 TNetbiosInfo = packed record
  AdapterStatus: TAdapterStatus;
  NameBuffer: Array [0..30] of TNameBuffer;
 end;

var
NCB: TNCB;
Enum: TLanaEnum;
NetbiosInfo: TNetbiosInfo;
I, A: Integer;
Ends: Byte;
begin
FillChar(NCB, SizeOf(TNCB), #0);
NCB.ncb_command := Char(NCBENUM);
NCB.ncb_buffer := @Enum;
NCB.ncb_length := SizeOf(TLanaEnum);
if Netbios(@NCB) = Char(NRC_GOODRET) then
  for I := 0 to Integer(Enum.length) - 1 do
  begin
    FillChar(NCB, SizeOf(TNCB), #0);
    NCB.ncb_lana_num := Enum.lana[I];
    NCB.ncb_command := Char(NCBRESET);
    if Netbios(@NCB) = Char(NRC_GOODRET) then
    begin
      FillChar(NetbiosInfo, SizeOf(TNetbiosInfo), #0);
      NCB.ncb_command := Char(NCBASTAT);
      Move(Addr[1], NCB.ncb_callname[0], Length(Addr));
      NCB.ncb_buffer := @NetbiosInfo;
      NCB.ncb_length := SizeOf(TNetbiosInfo);
      if Netbios(@NCB) = Char(NRC_GOODRET) then
        for A := 0 to NetbiosInfo.AdapterStatus.name_count - 1 do
        begin
          Ends := Byte(NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1]);
          if Ends=$20 then
            begin
            NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1] := #32;
            if result <> "" then
             Result := Result + #13#10;
            result := result + String(NetbiosInfo.NameBuffer[A].name);
            end;
        end;
    end;
  end;
end;


 
charoey_mag   (2009-01-23 10:52) [6]

Оп, вообще не понимаю, др вариант

function TMyThread.GetNetBiosNames(const Addr: String):string;
...............................
       fq1:=false;
       if Netbios(@NCB) = Char(NRC_GOODRET) then
         for A := 0 to NetbiosInfo.AdapterStatus.name_count - 1 do
         begin
           Ends := Byte(NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1]);
           if Ends=$20 then
             begin
             NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1] := #32;
             result:=String(NetbiosInfo.NameBuffer[A].name);
             fq1:=true;
             end
         end;
       if fq1=false then <======
        Ends:=0;        
     end;
   end;
end;

Почему присутствие этого if влияет на результат Netbios()??

Хм..., а на Delphi7 сервис паков случайно нет? Что то мне подсказывает что среда не всегда адекватна...


 
KSergey ©   (2009-01-23 11:05) [7]

> charoey_mag   (23.01.09 10:52) [6]
> Почему присутствие этого if влияет на результат Netbios()? ?

Может влияет на интерпретацию этих результатов, а не на сам результат?

> Хм..., а на Delphi7 сервис паков случайно нет? Что то мне
> подсказывает что среда не всегда адекватна...

Очень сомнительно, чтобы вы обнаружили баг. Не потому, что их нет в Д7, они есть, но далеко не в ифах :) Еще много надо копать, чтобы до них добраться.


 
charoey_mag   (2009-01-23 11:07) [8]


> Может влияет на интерпретацию этих результатов, а не на
> сам результат?

см [4]


 
Сергей М. ©   (2009-01-23 11:13) [9]


> charoey_mag   (23.01.09 10:52) [6]


Тебя чем не устроил код в [5] ?


 
charoey_mag   (2009-01-23 11:43) [10]


> Тебя чем не устроил код в [5] ?

Код под себя я все равно уже сделал, спасибо.

PS. в 5 в принципе не то, я просто в [4] ошибся там должно быть
if fq1=false then
 result:="Waring!"; //а не result
А по [5] получается если $20 не окажется то ничего и не изменится..

Меня больше интересует сама причина ошибки

и из [4]
>PS. Это только у меня for считает задом наперед и соответственно переворачивает значения в массивах??


 
Сергей М. ©   (2009-01-23 11:56) [11]


> Это только у меня


У всех, кто включил оптимизацию генерируемого компилятором кода.


> if fq1=false then
>  result:="Waring!"; //а не result


Какой телеге нужно это пятое колесо ?
Чем не устраивает

if result = "" then
Result:="Waring!";


?


 
charoey_mag   (2009-01-23 14:29) [12]

В вашем случае [5] проверка находится внурти
for A := 0 to NetbiosInfo.AdapterStatus.name_count - 1 do
     if Ends=$20 then
а надо делать снаружи цикла [4].


 
Сергей М. ©   (2009-01-23 15:07) [13]


> charoey_mag   (23.01.09 14:29) [12]


А зачем тебе вообще какая-то там проверка ?
И зачем вообще цикл по NetbiosInfo.AdapterStatus.name_count ?

Достаточно взять NetbiosInfo.NameBuffer[0] - это и будет интересующее тебя имя



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

Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.045 c
8-1192292701
Dmitry_12_08_73
2007-10-13 20:25
2009.03.15
Графические компоненты


2-1232649379
batya-x
2009-01-22 21:36
2009.03.15
Сглаженный текст


6-1199984401
maxistent
2008-01-10 20:00
2009.03.15
Проблемы с сокетами


2-1232796577
Арт
2009-01-24 14:29
2009.03.15
Как разместить ссылку в форме?


2-1232957936
smartleds
2009-01-26 11:18
2009.03.15
Добрый день, подскажите плз как интегрировать в программу





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский