-
> ketmar (07.08.2008 16:38:35) [35]
Не криво, если сеть 192.168.0.0/24 то глупо, если 192.168.0.0/16 то это реальный адрес, а не адрес броадкаста, тоже адрес сети. Все зависит от маски.
-
> тут до inet_addr нужна предобработка
А она по-любому нужна..
Автор же утверждает, что ему заранее неизвестна нотация параметра. На вход же inet_addr требуется подача полной или частичной Беркли-нотации
-
> Сергей М. (07.08.2008 16:44:37) [37]
А еще есть кульхачкеры, которые могут указать как -1 или как 4294967295 или как #FFFFFFFF и так далее, но количество вариантов все равно маленькое.
-
> Сергей М. (07.08.2008 16:58:41) [41]
Я обсуждаю предобработку только для одного адреса и пока в формате '255.255.255.255' результатом преобразования будет правильный адрес, но данный адрес исключен из обработки в функции, он совпадает с кодом ошибки, это плата за чистую переменную!
-
> Anatoly Podgoretsky © (07.08.08 17:01) [42]
А могут еще в CIDR-нотации учудить)
-
> Anatoly Podgoretsky © (07.08.08 17:03) [43]
> обсуждаю предобработку только для одного адреса и пока в > формате '255.255.255.255'
Ну это понятно.
-
> [0]Ты чтото не правильно готовишь. У меня возвращает все как надо: program Project2;
uses SysUtils, WinSock;
var
p: PHostEnt;
pp: PPChar;
Data: WSAData;
I: Integer;
begin
WSAStartup(2, Data);
P := gethostbyname('255.255.255.255');
with P^ do
begin
Writeln('h_name: ', h_name);
pp := PPChar(h_aliases);
while pp^ <> nil do
begin
Writeln('h_aliases: ', pp^);
Inc(pp);
end;
Writeln('h_addrtype: ', h_addrtype);
Writeln('h_length: ', h_length);
pp := PPChar(h_addr_list);
I := 0;
while I < h_length do
begin
Writeln('h_addr_list: ', Format('%d.%d.%d.%d', [ord(pp^[0]), ord(pp^[1]), ord(pp^[2]), ord(pp^[3])]));
Inc(pp);
Inc(I, 4);
end;
end;
Readln;
end.
Вывод: h_name: 255.255.255.255 h_addrtype: 2 h_length: 4 h_addr_list: 255.255.255.255
-
У меня подозрение, что автор неправильно использует поле PHostEnt.h_addr_list.
К примеру, если допустить одну оплошность в использовании этого поля я получаю результат: h_addr_list: 100.183.59.0, что очень похоже на результат автора :)
-
> не занимайся неясно чем, проверяй 255.255.255.255 руками
ты имеешь в виду: inet_addr -> проверка на 255.255.255.255 -> вызов gethostbyname?
А если вот так: inet_addr -> вызов gethostbyname -> проверка на 255.255.255.255 - но у меня алгоритм так не сработает. Как написано в [33] какого-то хрена gethostbyname над 255.255.255.255 выдает не -1, а какой-то реальный IP-адрес, каждый раз разный! Картинку приложил... бред какой-то...
> На вход же inet_addr требуется подача полной или частичной > Беркли-нотации
а ты уверен, что возможна одна единственная возможность - 255.255.255.255? Я вот в этом не уверен... А может сработает 0xFF.0xFF.0xFF.0xFF ?
Или может пробелы допускаются: "255 . 255 . 255 . 255" - может это тоже корректно. Это невозможно? Ну ты это знаешь, я этого не знаю. В большинстве случаев да, будет работать, но я люблю писать универсально...
И еще очень меня смущает, что gethostbyname над '255.255.255.255' возвращает какой-то IP-адрес... Откуда?
-
хотя я тоже. Правильнее так:
pp := PPChar(h_addr_list);
while pp^ <> nil do
begin
Writeln('h_addr_list: ', Format('%d.%d.%d.%d', [ord(pp^[0]), ord(pp^[1]), ord(pp^[2]), ord(pp^[3])]));
Inc(pp);
end;
-
> И еще очень меня смущает, что gethostbyname над '255.255. > 255.255' возвращает какой-то IP-адрес... Откуда?
Давай код
-
> если допустить одну оплошность в использовании этого поля
А запросто, кстати)
тут надо с чувством, с толком, с расстановкой, а у автора все на бегу происходит)
-
Автор исправь PInAddr(HostEn^.h_addr_list)^ на PInAddr(HostEn^.h_addr_list^)^
-
Да, забыл один раз разыименовать в коде... Поэтому такой косяк с GetHostByname... Разобрался.
Осталось только распознать, что inet_addr возвращает адрес броадкаста, а не ошибку ;( Зачем же так сделано то галимо...
-
> Осталось только распознать, что inet_addr возвращает адрес > броадкаста, а не ошибку
Вот ты, братец-кролик, упертый)
ну чем тебе этот "костыль" мешает - проверить, не представлен ли параметром именно этот адрес, дабы обойти при этой ситуации вызов inet_addr и конвертнуть его тремя строчками своего кода ?
-
> Осталось только распознать, что inet_addr возвращает адрес > броадкаста, а не ошибку
А тут все оч просто, если inet_addr не скушал переданный адрес, то отдай его в gethostbyname, если это броадкаст - ты и получишь броадкастовый в результате, а если это вообще что-то левое, то получишь ошибку.
-
А не проще использовать сразу gethostbyname и не парить мозг никому?
-
>[36] Dmitry S © (2008-08-07 16:43:00) >А что кривого-то? >[40] Anatoly Podgoretsky © (2008-08-07 16:58:00) ну, как-то некультурно сидеть на *.255. негласно принято, что туда вешают всякие сервисы.
--- All Your Base Are Belong to Us
-
> ketmar © (07.08.08 17:35) [57]
Предрассудки. Да и сервисы обычно вешают на .254 или .1-.10 :)
-
>[58] Dmitry S © (2008-08-07 17:37:00) не спорю, стандарта на это нет. но как-то не принято, и всё тут. %-)
--- Understanding is not required. Only obedience.
|