Форум: "Начинающим";
Текущий архив: 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