-
Добрый день, Уважаемые. Необходимо перечислить сетевые интерфейсы на машине, найти среди них частные 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;
Это как ?
-
Да, совсем забыл хоть какой-то кусок кода привести...
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;
-
> Но вот что-то не пойму, а как в структуре sockaddr_in определяется, > в каком формате записан IP адрес - SunB, SunW или u_long > ?
Это не нужно определять. Такая запись позволяет обратиться к структуре как к четырём байтам, двум словам или одному длинному целому. Сами данные никак не завсят от способа обращения к ним.
-
Да я уже понял. Когда начал последовательно набирать 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;
Спасибо за посильное участие...
|