Конференция "Прочее" » Нет отличия INADDR_NONE от INADDR_BROADCAST ;(
 
  • Пробежал... (07.08.08 14:31) [0]
    Вот такая забубень, что INADDR_NONE и INADDR_BROADCAST имеют одно значение... Чем это плохо спросите вы?

    Дело в том, что мой модуль работает так: сначала пытается делать inet_addr, если получает INADDR_NONE, то делает вывод что строка не является IP-адресом, применяет к ней GetHostByName и если удается получить IP - то посылает данные. Достаточно банальный и часто используемый способ работы.

    Но все дело портят броадкасты. Допустим, через мой модуль пытаются послать данные на адрес '255.255.255.255' - конечно, это неправильно так делать, но тем не менее работать то должно. А что получается? Мой модуль делает inet_addr, уж не знаю что возвращает эта функция, что она имеет в виду - INADDR_NONE или INADDR_BROADCAST, отличить то невозможно! После чего над строкой адреса '255.255.255.255' делается GetHostByName, и вот тут второй парадокс... Оно срабатывает!

    И более того, GetHostByName над строкой '255.255.255.255' возвращает IP-адрес: '52.169.21.0' !!! Откуда? Что это? Науке неизвестно... В результате данные уходят черт знает куда по конкретному IP-адресу, хотя указан адрес broadcast.

    Внимание, вопрос! А как вообще определить броадкаст это адрес или нет? Можно проверять строку на совпадение с '255.255.255.255' - но это костыль, ибо ведь известно, что адреса можно и в другом формате записывать, и вроде даже не через точку... Что же делать? Да и GetHostByName над каким-нибудь локальным 'vasya_pupkin.local' может разрешиться в 255.255.255.255 по идее, а это не отличить от INADDR_NONE. Как же быть?!

    Посылать данные в любом случае, даже если адрес INADDR_NONE тоже не вариант, а то будут посылать на всякие левые домены 'afiuoageh.locadsfg' - а пакет в результате разойдется всем по броалкасту.
  • Пробежал... (07.08.08 14:32) [1]
    и еще конечно очень любопытно каким таким образом:

    >GetHostByName над строкой '255.255.255.255' возвращает IP-
    >адрес: '52.169.21.0'

    очень очень интересно...
  • tesseract © (07.08.08 14:41) [2]

    >  Допустим, через мой модуль пытаются послать данные на адрес
    > '255.255.255.255' - конечно, это неправильно так делать,
    >  но тем не менее работать то должно


    Не в windows. И даже по подсети не проходит. В *nix всё ок.
  • DVM © (07.08.08 14:44) [3]

    > И более того, GetHostByName над строкой '255.255.255.255'
    > возвращает IP-адрес: '52.169.21.0' !!! Откуда? Что это?

    IP-адрес: 52.169.21.0

    OrgName:    E.I. du Pont de Nemours and Co., Inc.
    OrgID:      EDPDNC
    Address:    E.I. du Pont de Nemours and Co., Inc.
    Address:     1007 market Street
    City:       Wilmington
    StateProv:  DE
    PostalCode: 19893
    Country:    US

    NetRange:   52.0.0.0 - 52.255.255.255
    CIDR:       52.0.0.0/8
    NetName:    DUPONT1
    NetHandle:  NET-52-0-0-0-1
    Parent:    
    NetType:    Direct Assignment
    NameServer: APOLLO.LVS.DUPONT.COM
    NameServer: DNSAUTH1.SYS.GTEI.NET
    NameServer: DNSAUTH2.SYS.GTEI.NET
    NameServer: DNSAUTH3.SYS.GTEI.NET
    Comment:    
    RegDate:    1991-12-19
    Updated:    2007-08-01

    OrgTechHandle: DAC69-ARIN
    OrgTechName:   DUPONT ARIN CONTACT
    OrgTechPhone:  +1-302-992-2941
    OrgTechEmail:  contact@usa.dupont.com

    # ARIN WHOIS database, last updated 2008-08-06 19:10
    # Enter ? for additional hints on searching ARIN's WHOIS database.
  • Сергей М. © (07.08.08 14:59) [4]

    > адреса можно и в другом формате записывать, и вроде даже
    > не через точку


    Какую конкретно нотацию ты имеешь ввиду ?
  • Rouse_ © (07.08.08 15:04) [5]
    У меня gethostbyname('255.255.255.255') возвращает в S_addr значение INADDR_NONE, так что что-то ты перемудрил :)
  • Dmitry S © (07.08.08 15:13) [6]

    > Rouse_ ©   (07.08.08 15:04) [5]

     INADDR_BROADCAST = -1;
     INADDR_NONE      = -1;
  • Anatoly Podgoretsky © (07.08.08 15:14) [7]
    > Сергей М.  (07.08.2008 14:59:04)  [4]

    Ну например в виде Cardinal в текстовом формате.
  • Rouse_ © (07.08.08 15:16) [8]

    >  INADDR_BROADCAST = -1;
    >  INADDR_NONE      = -1;

    И? Развивай мысль ;)
  • Anatoly Podgoretsky © (07.08.08 15:16) [9]
    > Dmitry S  (07.08.2008 15:13:06)  [6]

    Все правильно INADDR_BROADCAST это -1 или в ИНЕТ виде 255.255.255.255 или #FFFFFFFF
  • Dmitry S © (07.08.08 15:17) [10]

    > Rouse_ ©   (07.08.08 15:16) [8]

    INADDR_BROADCAST = INADDR_NONE, а следовательно определить, что вернула функция невозможно, в чем и сложность автора.
  • Anatoly Podgoretsky © (07.08.08 15:22) [11]
    А никакой сложности и нет, просто автору в голову не приходить проверить это до вызова функции.
    INADDR_NONE это результат функции
    INADDR_BROADCAST это самый большой броадкаст адрес
  • Rouse_ © (07.08.08 15:24) [12]

    > INADDR_BROADCAST = INADDR_NONE

    не совсем верно:

    единственное различие между ними в наличие знака. INADDR_BROADCAST - это unsigned int равное 0хFFFFFFFF, а INADDR_NONE - это код ошибки которую возвращают Winsocket функции типа connect, имеет тип int и значение -1
  • Rouse_ © (07.08.08 15:25) [13]
    зы: с кодом ошибки я наверное переборщил ;)
  • Dmitry S © (07.08.08 15:25) [14]
    Это что, если я кину в инет пакет с адресом INADDR_BROADCAST, то он будет отправлен всем-всем компам инета?
  • Anatoly Podgoretsky © (07.08.08 15:25) [15]
    Диапазон все адресов это 2^32 и если какое то значение использовать как признак ошибки, то понятно, что его нельзя будет различить с реальным значением. Это же получается тот самый знаменитый, от стальной птицы, вопрос "Как очистить переменную Integer"
  • Dmitry S © (07.08.08 15:27) [16]

    > Anatoly Podgoretsky ©   (07.08.08 15:25) [15]

    К примеру адрес 0.0.0.0 имеет какое либо значение вообще?
  • Rouse_ © (07.08.08 15:27) [17]

    > то он будет отправлен всем-всем компам инета?

    в пределах подсети
  • Anatoly Podgoretsky © (07.08.08 15:27) [18]
    > Rouse_  (07.08.2008 15:24:12)  [12]

    Переборщил, код ошибки беззнаковое целое longword/dWord/Cardinal
  • Anatoly Podgoretsky © (07.08.08 15:28) [19]
    > Dmitry S  (07.08.2008 15:25:14)  [14]

    Автор путает адреса с кодами ошибок, аппельсины с котлетами.
  • Rouse_ © (07.08.08 15:28) [20]

    > код ошибки беззнаковое целое longword/dWord/Cardinal

    Результат функции int, тут я не верно назвал. Вообще оригинальная декларация выглядит как:
    #define INADDR_BROADCAST        (u_long)0xffffffff
    #define INADDR_NONE             0xffffffff

  • Сергей М. © (07.08.08 15:30) [21]

    > Anatoly Podgoretsky ©   (07.08.08 15:14) [7]


    Ну и что ?
    Я не понимаю, где костыль ..

    Сложно что ли проверить адрес по шаблонам рег.выражений для всех мыслимых нотаций ? Совсем не сложно)

    Да и какой идиот будет передавать IPv4-адрес не в Беркли-нотации ?
    А если и найдутся такие, почему не дать им отлуп вида "адрес задан неверно" ?
  • Dmitry S © (07.08.08 15:36) [22]

    > Rouse_ ©   (07.08.08 15:27) [17]
    >
    >
    > > то он будет отправлен всем-всем компам инета?
    >
    > в пределах подсети

    какой подсети именно?
  • Anatoly Podgoretsky © (07.08.08 15:38) [23]
    > Dmitry S  (07.08.2008 15:27:16)  [16]

    Имеет, это самая большая сеть, нулевая, вот к ней то и применяется данный адрес.
  • Rouse_ © (07.08.08 15:40) [24]

    > какой подсети именно?

    В твоей есесно :))))
  • Anatoly Podgoretsky © (07.08.08 15:40) [25]
    > Rouse_  (07.08.2008 15:27:17)  [17]

    В общем случае не верно. В рамках текущей маршрутизации, ничто не ограничивает посылать в любые сети. Просто в частном случае есть соглашение, что маршрутизаторы, особо (в обязательном порядке) смотрящие в Сеть не пропускают данные пакеты, но в тоже время это нормальное действие в локальных сетях.
  • Rouse_ © (07.08.08 15:41) [26]

    > В общем случае не верно.

    Скажем так: в большинстве случае верно, настроить сеть то конечно можно по разному :)
  • Anatoly Podgoretsky © (07.08.08 15:42) [27]
    > Сергей М.  (07.08.2008 15:30:21)  [21]

    А я что по твоему предложил?
    У него входящий параметр '255.255.255.255' вот его и надо проверять до вызова функции, при том не в любых нотациях, у него формат, согласно его же словам, четко зафиксирован.
  • Anatoly Podgoretsky © (07.08.08 15:54) [28]
    > Rouse_  (07.08.2008 15:41:26)  [26]

    Кульхачкеры очень мечтают сделать PING 255.255.255.255 и задосить всю Сеть :-)
  • Dmitry S © (07.08.08 16:01) [29]
    С ping 255.255.255.255 ясно. А почему тогда не получается сделать ping 192.168.0.255 (на широковещательный адрес локальной сети)...

    PS. Кстати ping 255.255.255.255 говорит, что "При проверке связи не удалось обнаружить узел 255.255.255.255. Проверьте имя узла и повторите попытку."
  • Anatoly Podgoretsky © (07.08.08 16:09) [30]
    > Dmitry S  (07.08.2008 16:01:29)  [29]

    Этот PS говорит о подобной программе, которая получила -1 в ответ на функцию.
    Кстати и хорошо, нефиг досить сеть.

    А PING это не UDP и не даже TCP
  • ketmar © (07.08.08 16:28) [31]
    >[29] Dmitry S © (2008-08-07 16:01:00)
    0.0.0.0, так же, как 255.255.255.255 — «фиктивные» адреса. их на самом деле нет. а 192.168.0.255 — вполне конкретный адрес.

    ---
    Understanding is not required. Only obedience.
  • Anatoly Podgoretsky © (07.08.08 16:33) [32]
    > ketmar  (07.08.2008 16:28:31)  [31]

    В рамках супер сети - да, но в рамках сети 192.168.0.255 такой же фиктивный, маленький бродкаст и 192.168.0.0 сеть.
  • Пробежал... (07.08.08 16:34) [33]

    > Не в windows. И даже по подсети не проходит

    ты ошибаешься.


    > IP-адрес: 52.169.21.0
    > OrgName:    E.I. du Pont de Nemours and Co., Inc.
    > OrgID:      EDPDNC
    ...

    я и сам прекрасно могу сделать whois. Ну принадлежит это компании какой-то, толку то? Вопрос не кому принадлежит, а какого хрена такой адрес образуется.


    > Какую конкретно нотацию ты имеешь ввиду ?

    да откуда я знаю? Я как разработчик модуля понятия не имею в каком там формате мне зададут имя хоста строкой. Ручками обрабатывать какие-то варианты - не айс, мало ли что. Хочется гибкости и чтобы за меня это кто-нибудь сделал, например windows... неужели так нельзя?
    Зачем мне изучать все возможные нотации, мало ли их сколько...


    > У меня gethostbyname('255.255.255.255') возвращает в S_addr
    > значение INADDR_NONE, так что что-то ты перемудрил :)

    Розыч, я сам в шоке!!! Причем, при последовательных вызовах этого кода адрес одинаковый. Но при разных запусках приложения адрес каждый раз разный и никакой последовательности, как будто это random...

    Смотри картинку! http://sharepix.ru/204333k07/ - мож я ступил где?
  • Rouse_ © (07.08.08 16:37) [34]
    0.0.0.0 зарезервирован как адрес роутера по умолчанию.
  • ketmar © (07.08.08 16:38) [35]
    >[32] Anatoly Podgoretsky © (2008-08-07 16:33:00)
    я к тому, что 0 и -1 никогда не будут «валидным адресом». а 192.168.0.255 — запросто (хотя это и криво).

    >[33] Пробежал… (2008-08-07 16:34:00)
    не занимайся неясно чем, проверяй 255.255.255.255 руками. у него всё равно имени нет. а если кто-то как-то прописал алиас — то этот кто-то большой дурак.

    ---
    Understanding is not required. Only obedience.
  • Dmitry S © (07.08.08 16:43) [36]

    > (хотя это и криво)

    А что кривого-то? Адрес как адрес.


    > В рамках супер сети - да, но в рамках сети 192.168.0.255
    > такой же фиктивный, маленький бродкаст и 192.168.0.0 сеть.
    >

    Тоже не факт.


    > Розыч, я сам в шоке!!! Причем, при последовательных вызовах
    > этого кода адрес одинаковый. Но при разных запусках приложения
    > адрес каждый раз разный и никакой последовательности, как
    > будто это random...

    Может быть винда определила, что адрес кривой, и не удосужилась заполнить данное поле, хотя бы нулями?
  • Сергей М. © (07.08.08 16:44) [37]

    > откуда я знаю? Я как разработчик модуля понятия не имею
    > в каком там формате мне зададут имя хоста строкой


    Довольно странно это - разрабатывать модуль, не имея утвержденного протокола межмодульного взаимодействия)

    Впрочем, вариантов-то не так много - либо имя хоста либо адрес)
  • Anatoly Podgoretsky © (07.08.08 16:54) [38]
    > Пробежал...  (07.08.2008 16:34:33)  [33]

    Да не мучайся, тебе нужен этот адрес или нет?
    Если не нужен считай что он невозможен INADDR_NONE и делов то.
    Другое дело если с этим адресом надо работать, тут до inet_addr нужна предобработка.
  • Anatoly Podgoretsky © (07.08.08 16:56) [39]
    > Rouse_  (07.08.2008 16:37:34)  [34]

    Ты имеешь в виду 0.0.0.0/0.0.0.0 как ANY_NETWORK/ANY_INTERFACE и т.д. эту сеть часто используют в данном качестве, как 255,255.255.255 может быть использован не как адрес броадкаста. Просто два особых адреса и потребность в ANY и ERROR
  • 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.
  • Пробежал... (07.08.08 18:07) [60]

    > А тут все оч просто, если inet_addr не скушал переданный
    > адрес, то отдай его в gethostbyname, если это броадкаст
    > - ты и получишь броадкастовый в результате, а если это вообще
    > что-то левое, то получишь ошибку

    хм... ступил что-то ;)
    Просто у меня GetHostByName не работал... А тут действительно, чего париться ;)
  • Anatoly Podgoretsky © (07.08.08 20:21) [61]
    > Пробежал...  (07.08.2008 17:22:53)  [53]

    Затем, что иначе нужен dWord на единицу больший чем FFFFFFFF,
  • Anatoly Podgoretsky © (07.08.08 20:22) [62]
    > ketmar  (07.08.2008 17:35:57)  [57]

    Туда вешают админов.
  • ketmar © (07.08.08 20:54) [63]
    >[62] Anatoly Podgoretsky © (2008-08-07 20:22:00)
    всех не перевешаете!

    ---
    Understanding is not required. Only obedience.
  • Anatoly Podgoretsky © (07.08.08 21:03) [64]
    > ketmar  (07.08.2008 20:54:03)  [63]

    Я помню этот лозунг
  • umbra © (07.08.08 23:53) [65]

    > Диапазон все адресов это 2^32

    не совсем. Диапазон адресов бродкаста вычисляется из адреса сети и маски. обычно гораздо меньше.
 
Конференция "Прочее" » Нет отличия INADDR_NONE от INADDR_BROADCAST ;(
Есть новые Нет новых   [134440   +3][b:0.001][p:0.003]