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

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

Получить имя NetBIOS


charoey_mag ©   (2009-01-22 15:52:00) 

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

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


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


> charoey_mag   (23.01.09 14:29) [12]


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

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


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

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


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


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


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


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


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

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


?


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


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

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

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

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

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


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


> charoey_mag   (23.01.09 10:52) [6]


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


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


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

см [4]


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

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

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

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

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


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

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

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 сервис паков случайно нет? Что то мне подсказывает что среда не всегда адекватна...


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



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


> 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 09:04:00) [11]

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


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

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

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


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


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


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


Наверх

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