![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить список компов в локальной сети? [D7, NT4]
Lex © (2003-01-18 10:49:00)Или, хотя бы, как проверить, что комп с именем name подключен к сети? OS - Windows NT4. Спасибо.
Lex (2003-01-19 12:02:00) [1]NewGuest> Можешь объяснить, как это все работает, или скажи, в какой переменной хранится список компов? И как его в tstrings преобразовать?
sinm> Я не спец в этой области, так что попроще, пожалуйста :)
sinm (2003-01-19 05:29:00) [2]Хочу добавить, что пинга мало, если нужно все сделать быстро. Лучше (если, конечно, не лень) послать на 137/udp запрос с заданным таймаутом. Если таймаут (в локале где-то 50-70 мсек) превзойден, то комп не отдаст своего имени. Если задача не имеет смысла без опроса по smb, тj надо сделать connect(timeout) на порт 139/tcp. А если надо получить простой набор компов, на которых загружен стек ip, то легче по icmp отправить запрос на последний (255?) адрес вашей маски и после этого читать ответы из буфера. Правда при этом надо быть уверенным в том, что прямые широковещательные сообщения не экранируются маршрутизаторами/свитчами/стенами.
NewGuest (2003-01-18 13:59:00) [3]вот переменные, кот. требуются в примере списка компов
ResourceCount : Integer;
NetResources: array[0..200]of TNetResource;
NewGuest (2003-01-18 13:58:00) [4]Список компов...
function enumResourcesIn(Workgroup: string): boolean;
var
EnumHandle: THandle;
WorkgroupRS: TNetResource;
BufSize: Cardinal;
Entries: Cardinal;
Rest: Cardinal;
begin
ResourceCount:=0;
Workgroup:=Workgroup+#0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);
with WorkgroupRS do begin
dwScope:=RESOURCE_GLOBALNET;
dwType:=RESOURCETYPE_ANY;
dwDisplayType:=RESOURCEDISPLAYTYPE_DOMAIN;
dwUsage:=RESOURCEUSAGE_CONTAINER;
lpRemoteName:=@Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @WorkgroupRS, EnumHandle);
Entries:=200;
BufSize:=SizeOf(NetResources);
Rest:=WNetEnumResource(EnumHandle, Entries, @NetResources[0], BufSize);
if (Rest=NO_ERROR) and (Entries>0) then Result:=true else Result:=false;
ResourceCount:=Entries;
WNetCloseEnum(EnumHandle);
end;
Пропинговать отдельный комп (WinSock подключи)
function getNameOf(const IP: string): string;
var
h: PHostEnt;
addr: TSockAddr;
GInitData: TWSADATA;
begin
WSAStartup($101, GInitData);
Result:="";
addr.sin_addr.s_addr:=inet_addr(pchar(IP));
if addr.sin_addr.s_addr<>INADDR_NONE then
begin
h:=gethostbyaddr(@addr.sin_addr.s_addr, sizeof(addr), AF_INET);
if h<>nil then Result:=h^.h_name
end;
WSACleanup
end;