Конференция "Прочее" » Нет отличия INADDR_NONE от INADDR_BROADCAST ;(
 
  • Anatoly Podgoretsky © (07.08.08 16:58) [40]
    > ketmar  (07.08.2008 16:38:35)  [35]

    Не криво, если сеть 192.168.0.0/24 то глупо, если 192.168.0.0/16 то это реальный адрес, а не адрес броадкаста, тоже адрес сети. Все зависит от маски.
  • Сергей М. © (07.08.08 16:58) [41]

    > тут до inet_addr нужна предобработка


    А она по-любому нужна..

    Автор же утверждает, что ему заранее неизвестна нотация параметра.
    На вход же inet_addr требуется подача полной или частичной Беркли-нотации
  • Anatoly Podgoretsky © (07.08.08 17:01) [42]
    > Сергей М.  (07.08.2008 16:44:37)  [37]

    А еще есть кульхачкеры, которые могут указать как -1 или как 4294967295 или как #FFFFFFFF и так далее, но количество вариантов все равно маленькое.
  • Anatoly Podgoretsky © (07.08.08 17:03) [43]
    > Сергей М.  (07.08.2008 16:58:41)  [41]

    Я обсуждаю предобработку только для одного адреса и пока в формате '255.255.255.255'
    результатом преобразования будет правильный адрес, но данный адрес исключен из обработки в функции, он совпадает с кодом ошибки, это плата за чистую переменную!
  • Сергей М. © (07.08.08 17:03) [44]

    > Anatoly Podgoretsky ©   (07.08.08 17:01) [42]


    А могут еще в CIDR-нотации учудить)
  • Сергей М. © (07.08.08 17:04) [45]

    > Anatoly Podgoretsky ©   (07.08.08 17:03) [43]


    > обсуждаю предобработку только для одного адреса и пока в
    > формате '255.255.255.255'


    Ну это понятно.
  • Dmitry S © (07.08.08 17:08) [46]
    > [0]
    Ты чтото не правильно готовишь. У меня возвращает все как надо:

    program Project2;

    {$APPTYPE CONSOLE}
    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
       {h_name}
       Writeln('h_name: ', h_name);

       {h_aliases}
       pp := PPChar(h_aliases);
       while pp^ <> nil do
       begin
         Writeln('h_aliases: ', pp^);
         Inc(pp);
       end;

       {h_addrtype}
       Writeln('h_addrtype: ', h_addrtype);

       {h_length}
       Writeln('h_length: ', h_length);

       {h_addr_list}
       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
  • Dmitry S © (07.08.08 17:12) [47]
    У меня подозрение, что автор неправильно использует поле PHostEnt.h_addr_list.

    К примеру, если допустить одну оплошность в использовании этого поля я получаю результат: h_addr_list: 100.183.59.0, что очень похоже на результат автора :)
  • Пробежал... (07.08.08 17:14) [48]

    > не занимайся неясно чем, проверяй 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-адрес... Откуда?
  • Dmitry S © (07.08.08 17:14) [49]
    хотя я тоже.
    Правильнее так:

       {h_addr_list}
       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;

  • Dmitry S © (07.08.08 17:15) [50]

    > И еще очень меня смущает, что gethostbyname над '255.255.
    > 255.255' возвращает какой-то IP-адрес... Откуда?

    Давай код
  • Сергей М. © (07.08.08 17:15) [51]

    > если допустить одну оплошность в использовании этого поля


    А запросто, кстати)

    тут надо с чувством, с толком, с расстановкой, а у автора все на бегу происходит)
  • Dmitry S © (07.08.08 17:19) [52]
    Автор исправь
    PInAddr(HostEn^.h_addr_list)^
    на
    PInAddr(HostEn^.h_addr_list^)^
  • Пробежал... (07.08.08 17:22) [53]
    Да, забыл один раз разыименовать в коде... Поэтому такой косяк с GetHostByname... Разобрался.

    Осталось только распознать, что inet_addr возвращает адрес броадкаста, а не ошибку ;( Зачем же так сделано то галимо...
  • Сергей М. © (07.08.08 17:28) [54]

    > Осталось только распознать, что inet_addr возвращает адрес
    > броадкаста, а не ошибку


    Вот ты, братец-кролик, упертый)

    ну чем тебе этот "костыль" мешает - проверить, не представлен ли параметром именно этот адрес, дабы обойти при этой ситуации вызов inet_addr и конвертнуть его тремя строчками своего кода ?
  • Rouse_ © (07.08.08 17:29) [55]

    > Осталось только распознать, что inet_addr возвращает адрес
    > броадкаста, а не ошибку

    А тут все оч просто, если inet_addr не скушал переданный адрес, то отдай его в gethostbyname, если это броадкаст - ты и получишь броадкастовый в результате, а если это вообще что-то левое, то получишь ошибку.
  • Dmitry S © (07.08.08 17:34) [56]
    А не проще использовать сразу gethostbyname и не парить мозг никому?
  • ketmar © (07.08.08 17:35) [57]
    >[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
  • Dmitry S © (07.08.08 17:37) [58]

    > ketmar ©   (07.08.08 17:35) [57]

    Предрассудки. Да и сервисы обычно вешают на .254 или .1-.10 :)
  • ketmar © (07.08.08 17:41) [59]
    >[58] Dmitry S © (2008-08-07 17:37:00)
    не спорю, стандарта на это нет. но как-то не принято, и всё тут. %-)

    ---
    Understanding is not required. Only obedience.
 
Конференция "Прочее" » Нет отличия INADDR_NONE от INADDR_BROADCAST ;(
Есть новые Нет новых   [134440   +3][b:0][p:0.001]