Получение всех ip-адресов компа на delphi.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Proger10, 29 Oct 2009.

  1. Proger10

    Proger10 Member

    Joined:
    19 Dec 2008
    Messages:
    80
    Likes Received:
    7
    Reputations:
    0
    Как можно получить все ip адреса компа (а вдруг у юзера несколько (больше одного) сетевых адаптеров)??
    ЗЫ Инди не подойдет - много весит!
     
  2. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Регулярками выдрать из ipconfig'а...
    о_О, а инди тут при чем?
     
  3. Proger10

    Proger10 Member

    Joined:
    19 Dec 2008
    Messages:
    80
    Likes Received:
    7
    Reputations:
    0
    Там есть IdIpAddrMon.
    ЗЫ Я от него и хочу избввится - сейчас он у меня используется.
     
  4. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Тема не в том разделе создана
     
  5. Proger10

    Proger10 Member

    Joined:
    19 Dec 2008
    Messages:
    80
    Likes Received:
    7
    Reputations:
    0
    Если это тонкий намек на то, что мне в [Delphi]/[Pascal] Задай вопрос, получи ответ, то уж извеняйте!! , а если нет, то я непонял....

    И всё-же по теме??

    Пытался код из индюка вытащить - получилось что-то унылое... и вылетающее по причине Access violation
     
    #5 Proger10, 29 Oct 2009
    Last edited: 29 Oct 2009
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    можно через сырые сокеты делать это типа так:
    Code:
    var
    n_addr : integer; // Хранит кол-во найденный интерфейсов
    n, a : integer;    // Дополнительные переменные
    raw_socket:tsocket; // Переменная для создания сокета
    WSData:tWSAData;    // Переменная для инициализации библиотеки сокетов
    llist:packed record
    iAddressCount : Integer;
    Address       : Array [0..10] of SOCKET_ADDRESS;
    end;
    
    begin
    // инициализация библиотеки сокетов
    if WSAStartup($202, WSData)<>0 then Errors('[-] WSAStartup'+#13#10) else Oks('[+] WSAStartup'+#13#10);
    
    // создание сокета
    raw_socket:=socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    // проверка на ошибки
    if raw_socket=INVALID_SOCKET  then Errors('[-] Create RAW socket'+#13#10) else Oks('[+] Create RAW socket'+#13#10);
    
    
    // получаем все интерфейсы? что есть на компьютере.
    if WSAIoctl(raw_socket, SIO_ADDRESS_LIST_QUERY, nil, 0,@llist, 1024, @n, nil, nil)=SOCKET_ERROR  then
    Errors('[-] WSAIoctl'+#13#10) else Oks('[+] WSAIoctl'+#13#10);
    
    n_addr:=llist.iAddressCount; // получение количества интерфейсов
    
    // если кол-во интерфейсов=0, то ошибка
    if n_addr=0 then Errors('[-] Interface count: 0'+#13#10) else Oks('[+] Interface count: '+inttostr(n_addr)+#13#10);
    
    // вывод IP-адресов всех найденных интерфейсов
    for a:=0 to n_addr-1 do begin
    s:=inet_ntoa(llist.Address[a].lpSockaddr.sin_addr);
    Oks('    Interface fount: '+s+#13#10);
    end;
    
    
     
    #6 slesh, 29 Oct 2009
    Last edited: 29 Oct 2009
    1 person likes this.
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    P.S. в 5005 статей по Delphi есть статейка
    Получение IP-адреса и маски для всех сетевых интерфейсов
     
  8. Gray_Wolf

    Gray_Wolf Active Member

    Joined:
    7 Mar 2009
    Messages:
    377
    Likes Received:
    135
    Reputations:
    10
    Не проще ли в CMD написать ipconfig /all а потом отпарсить результат...
     
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Gray_Wolf нет не проще. Это самый быстрый способ. Да и не очень то и большой. А вот запустить программу, получить её вывод и отпарсить - это однако боле напряжнее на систему. Тыже чтобы сложит в программа 5+6 не запускаеш калькулятор, не вставляеш туда данные и не эмулируеш нажатия на кнопку Enter