Конференция "Сети" » Поиск частного IP адреса среди сетевых интерфейсов
 
  • Dmitry (22.03.14 15:17) [0]
    Добрый день, Уважаемые.
    Необходимо перечислить сетевые интерфейсы на машине, найти среди них частные IP (10.0.0.0 — 10.255.255.255 и т.д.) взять маску и вычислить адрес бродкаста (например 10.9.255.255). Строки парсить не хочу принципиально (inet_ntoa(), inet_aton() и иже с ними), мне нужен формат в виде четырех 8-битных чисел. Пример перечисления интерфейсов есть в сети (модуль USock.pas). Но вот что-то не пойму, а как в структуре sockaddr_in определяется, в каком формате записан IP адрес - SunB, SunW или u_long ? Ну то что sin_addr: TInAddr это я понимаю. Расшифруйте пожалуйста неучу структуру из WinSock.pas

     PInAddr = ^TInAddr;
     {$EXTERNALSYM in_addr}
     in_addr = record
       case integer of
         0: (S_un_b: SunB);
         1: (S_un_w: SunW);
         2: (S_addr: u_long);
     end;
     TInAddr = in_addr;

    Это как ?
  • Dmitry (22.03.14 15:21) [1]
    Да, совсем забыл хоть какой-то кусок кода привести...

           if (pAddrInet.sin_addr.S_un_b.s_b1=10) or ((pAddrInet.sin_addr.S_un_b.s_b1=172) and (pAddrInet.sin_addr.S_un_b.s_b2=16) or ((pAddrInet.sin_addr.S_un_b.s_b1=192) and (pAddrInet.sin_addr.S_un_b.s_b2=168) then
            begin
             // Ищем маску
            end;

  • Styx (22.03.14 21:16) [2]

    > Но вот что-то не пойму, а как в структуре sockaddr_in определяется,
    >  в каком формате записан IP адрес - SunB, SunW или u_long
    > ?

    Это не нужно определять. Такая запись позволяет обратиться к структуре как к четырём байтам, двум словам или одному длинному целому. Сами данные никак не завсят от способа обращения к ним.
  • Dmitry (22.03.14 23:55) [3]
    Да я уже понял. Когда начал последовательно набирать pAddrInet. и т.д. и смотрел подсказки компилятора. Char оказывается SunB а не Byte. И соответственно получаем

          if (pAddrInet.sin_addr.S_un_b.s_b1=#10) or
              ((pAddrInet.sin_addr.S_un_b.s_b1=#172) and (pAddrInet.sin_addr.S_un_b.s_b2=#16)) or
              ((pAddrInet.sin_addr.S_un_b.s_b1=#192) and (pAddrInet.sin_addr.S_un_b.s_b2=#168)) then
            begin
             // Ищем маску
            end;


    Спасибо за посильное участие...
 
Конференция "Сети" » Поиск частного IP адреса среди сетевых интерфейсов
Есть новые Нет новых   [134427   +35][b:0][p:0.001]