Ip-адреса всех компьютеров в сети

  • Автор темы lazynov
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

lazynov

#1
Как имея имена компьтеров в сети узнать их IP? Или просто: как узнать IP-адреса всех компьютеров в сети! Помогите! PLEASE!
 
6

62316e

#2
Вот мой код под BCB.
Код:
TStringList * __fastcall GetLANHosts()
{
TStringList *pcls = new TStringList();
AnsiString strTemp;
struct hostent *host;
struct in_addr *ptr;

DWORD dwScope(RESOURCE_CONTEXT);
NETRESOURCE *NetResource(NULL);
HANDLE hEnum;
WNetOpenEnum(dwScope, NULL, NULL, NULL, &hEnum );

WSADATA wsaData;
WSAStartup(MAKEWORD(1,1),&wsaData);

if ( hEnum )
{
DWORD Count(0xFFFFFFFF);
DWORD BufferSize(2048);
LPVOID Buffer(new char[2048]);
WNetEnumResource( hEnum, &Count, Buffer, &BufferSize );
NetResource = (NETRESOURCE*)Buffer;
char szHostName[200];
for (unsigned int i = 0; i < BufferSize/sizeof(NETRESOURCE);i++, NetResource++ )
{
if (NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY)
{
if (NetResource->lpRemoteName )
{
AnsiString strFullName = NetResource->lpRemoteName;
if (strFullName.SubString(1,2)=="\\\\")
{
strFullName = strFullName.SubString(3,128);
}
gethostname( szHostName, strlen( szHostName ) );
host = gethostbyname(strFullName.c_str());
if(host == NULL)
continue;
ptr = (struct in_addr *) host->h_addr_list[0];
int a=0;
int b=0;
int c=0;
int d=0;
asm
{
mov eax, [ebp-0x000000a0]
xor edx, edx
mov dl, [eax]
mov [ebp-0x000000c0],edx
}
asm
{
mov eax, [ebp-0x000000a0]
xor edx, edx
mov dl, [eax+0x01]
mov [ebp-0x000000c4],edx
}
asm
{
mov ecx, [ebp-0x000000a0]
xor eax, eax
mov al, [ecx+0x02]
mov [ebp-0x000000c8],eax
}
asm
{
mov edx, [ebp-0x000000a0]
xor ecx, ecx
mov cl, [edx+0x03]
mov [ebp-0x000000cc],ecx
}
pcls->Add("["+IntToStr(a)+"."+IntToStr(b)+"."+IntToStr(c)+"."+IntToStr(d)+"] "+strFullName+" ("+NetResource->lpComment+")");
}
}
}
delete Buffer;
WNetCloseEnum( hEnum );
}
WSACleanup();
return pcls;
}
 
L

lazynov

#3
Спасибо, конечно, тебе, 62316e, за ответ, но на Delphi, бо я по другому не разумею! :) Ладно ассемблерные вставки - это нормально, но весь остальной код... Если кто может на Delphi - помогите!
 
A

Alex Death

#4
Це проблема сеть просканить на наличие машин?
 

Kmet

Java Team
25.05.2006
1 036
8
#6
связки функций gethostbyname, inet_ntoa будет достаточно

Для: 62316e
Велосипедисты вперед <_<
 
L

Little Friend

#8
И как, применение ассемблера сильно оптимизировало процесс определения IP-адресов?
 
6

62316e

#9
И как, применение ассемблера сильно оптимизировало процесс определения IP-адресов?
Опа. ещё один гуру. Ети вставки ниче не оптимизируют.
Аналогичны етим:
Код:
					 int a = ptr->S_un.S_un_b.s_b1;
int b = ptr->S_un.S_un_b.s_b2;
int c = ptr->S_un.S_un_b.s_b3;
int d = ptr->S_un.S_un_b.s_b4;
Учимся делать РТФМ.
 

Kmet

Java Team
25.05.2006
1 036
8
#10
Считаешь правильным смещение на локальные переменные с модификатором времени жизни auto задавать константами? Учимся делать РТФМ? Ну так тыкни меня ламера в стандарт, где определяются правила размещения в памяти для таких переменных. Нельзя дать гарантий что этот код переносим даже между различными версиями билдера. Даже изменение настроек оптимизации и то может привести к его неработоспособности. Да, конечно, для билдера с его "шаблонным" компилятором такой сценарий маловероятен, но все же в коммерческом приложении такой подход явно не уместен. Это не говоря уже о трудностях в поддержке таких извратов.
 
Z

Zakus

#11
Для: Kmet


член... клуба а тебе не нравиться наш аццкий стиль кодинга? а зря нас аццких кодероф много, на стандарты на плевать, шо думаешь тока микрософтавцы могут так писать... нееее... мы тоже))\

*я ацкий маньяк, несу чушь просьба не обращать внимнаие*
 
6

62316e

#12
Для: Kmet
Дык. Извини меня за мою наивность но все же: этот код был написан много лет назад. асм-вставки скопированы с дисасамблера (CopyPaste). те. Эти вопросы не ко мне. Я не асмовщик, не надо меня учить, все равно не пойму)
 
Z

Zakus

#13
Для: Kmet

кстати ты всегда можешь дать гарантию что код будет перенасимым с одной версии билдера(дельфей, визуалстудии) на другую? )

зы
кстати можно взять ещё компонент Инди для ICMP или как та его и пингавать любой диапазон айпишек
 

Kmet

Java Team
25.05.2006
1 036
8
#14
Для билдера не знаю, не использую. Да и плохо он стандарту соответсвует.
Для студий вполне, конечно если специфика задачи позволяет. Но в любом случае обеспечение переносимости является хорошим тоном и на серьезных конторах является требованием де факто.
 
L

lazynov

#15
Мы не выяснять сюда пришли "кто ламер, а кто хакер"! :) Блин кто нибудь тестните прогу и скажите что выдало в LISTBOX'е. Должно по идее WORKGROUP выдать... Но у меня нету сети!
 

Вложения

6

62316e

#16
Для: lazynov
Некто не выясняет. Люди сами себе проблемы делают.
Если не тяжело код покажы плиз к groups.rar
 
L

lazynov

#17
Если не тяжело код покажы плиз к groups.rar
Код приложения?
Так что он в LIST выводит? У меня на localhost название рабочей группы без первых двух букв. Но ето на localhost. А как в реальной сетке будет - не знаю! Подскажите.
Вот код:
Код:
procedure GetGroups(list: TListBox);
var
EnumWorkGroupHandle, EnumComputerHandle: THandle;
EnumError: DWORD;
Network: TNetResource;
WorkGroupEntries, ComputerEntries: DWORD;
EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
EnumBufferLength: DWORD;
i, j: DWORD;
begin
list.Clear;
FillChar(Network, SizeOf(Network), 0);
with Network do
begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONTAINER;
end;
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle);
if EnumError = NO_ERROR then
begin
WorkGroupEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength);
if EnumError = NO_ERROR then
begin
for i := 1 to WorkGroupEntries do
begin
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer[I], EnumComputerHandle);
if EnumError = NO_ERROR then
begin
ComputerEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumComputerBuffer);
EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength);
if EnumError = NO_ERROR then
for j := 1 to ComputerEntries do
list.Items.Add(Copy(EnumComputerBuffer[j].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));
WNetCloseEnum(EnumComputerHandle);
end;
end;
end;
WNetCloseEnum(EnumWorkGroupHandle);
end;
if EnumError = ERROR_NO_MORE_ITEMS then 
EnumError := NO_ERROR;
end;
Взят кстати из DRKB из статьи "Как узнать все компы в сети". Но на самом деле, код показывает WORKGROUP, или что-то подобное...
 
L

lazynov

#18
О!!! Я нашел ошибку! Теперь все работает! :D :D :D
Выделено жирным!
Ну вот, получайте процедуру получения Workgroups! Полность доработанная!
----------------------------------------------------------------------------------------------
const
MaxEntries = 250;

procedure GetGroups(list: TListBox);
var
EnumWorkGroupHandle, EnumComputerHandle: THandle;
EnumError: DWORD;
Network: TNetResource;
WorkGroupEntries, ComputerEntries: DWORD;
EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
EnumBufferLength: DWORD;
i, j: DWORD;
begin
list.Clear;
FillChar(Network, SizeOf(Network), 0);
with Network do
begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONTAINER;
end;
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle);
if EnumError = NO_ERROR then
begin
WorkGroupEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength);
if EnumError = NO_ERROR then
begin
for i := 1 to WorkGroupEntries do
begin
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer, EnumComputerHandle);
if EnumError = NO_ERROR then
begin
ComputerEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumComputerBuffer);
EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength);
if EnumError = NO_ERROR then
for j := 1 to ComputerEntries do
list.Items.Add(Copy(EnumComputerBuffer[j].lpRemoteName, 0, Length(EnumComputerBuffer[J].lpRemoteName)));
WNetCloseEnum(EnumComputerHandle);
end;
end;
end;
WNetCloseEnum(EnumWorkGroupHandle);
end;
if EnumError = ERROR_NO_MORE_ITEMS then
EnumError := NO_ERROR;
end;
 
Статус
Закрыто для дальнейших ответов.