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

Тема в разделе "Delphi - Сети", создана пользователем lazynov, 23 июн 2006.

Статус темы:
Закрыта.
  1. lazynov

    lazynov Гость

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

    62316e Гость

    Вот мой код под BCB.
    Код (Text):
    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;
    }
     
  3. lazynov

    lazynov Гость

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

    Alex Death Гость

    Це проблема сеть просканить на наличие машин?
     
  5. lazynov

    lazynov Гость

    Проблема получить их IP-адреса, а имена компов в сети я знаю как найти!
     
  6. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    связки функций gethostbyname, inet_ntoa будет достаточно

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

    62316e Гость

    Судя по количеству твоих постов и даты регистрации, ты своих 5 шпиц не в какой велосипед всунуть не можешь.
     
  8. Little Friend

    Little Friend Гость

    И как, применение ассемблера сильно оптимизировало процесс определения IP-адресов?
     
  9. 62316e

    62316e Гость

    Опа. ещё один гуру. Ети вставки ниче не оптимизируют.
    Аналогичны етим:
    Код (Text):
                         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;
    Учимся делать РТФМ.
     
  10. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Считаешь правильным смещение на локальные переменные с модификатором времени жизни auto задавать константами? Учимся делать РТФМ? Ну так тыкни меня ламера в стандарт, где определяются правила размещения в памяти для таких переменных. Нельзя дать гарантий что этот код переносим даже между различными версиями билдера. Даже изменение настроек оптимизации и то может привести к его неработоспособности. Да, конечно, для билдера с его "шаблонным" компилятором такой сценарий маловероятен, но все же в коммерческом приложении такой подход явно не уместен. Это не говоря уже о трудностях в поддержке таких извратов.
     
  11. Zakus

    Zakus Гость

    Для: Kmet


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

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

    62316e Гость

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

    Zakus Гость

    Для: Kmet

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

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Для билдера не знаю, не использую. Да и плохо он стандарту соответсвует.
    Для студий вполне, конечно если специфика задачи позволяет. Но в любом случае обеспечение переносимости является хорошим тоном и на серьезных конторах является требованием де факто.
     
  15. lazynov

    lazynov Гость

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

    Вложения:

    • Groups.rar
      Размер файла:
      157,7 КБ
      Просмотров:
      106
  16. 62316e

    62316e Гость

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

    lazynov Гость

    Код приложения?
    Так что он в LIST выводит? У меня на localhost название рабочей группы без первых двух букв. Но ето на localhost. А как в реальной сетке будет - не знаю! Подскажите.
    Вот код:
    Код (Text):
    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, или что-то подобное...
     
  18. lazynov

    lazynov Гость

    О!!! Я нашел ошибку! Теперь все работает! :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;
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей