Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.28;
Скачать: CL | DM;

Вниз

Нет отличия INADDR_NONE от INADDR_BROADCAST ;(   Найти похожие ветки 

 
Пробежал...   (2008-08-07 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" - а пакет в результате разойдется всем по броалкасту.


 
Пробежал...   (2008-08-07 14:32) [1]

и еще конечно очень любопытно каким таким образом:

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

очень очень интересно...


 
tesseract ©   (2008-08-07 14:41) [2]


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


Не в windows. И даже по подсети не проходит. В *nix всё ок.


 
DVM ©   (2008-08-07 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.


 
Сергей М. ©   (2008-08-07 14:59) [4]


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


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


 
Rouse_ ©   (2008-08-07 15:04) [5]

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


 
Dmitry S ©   (2008-08-07 15:13) [6]


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

 INADDR_BROADCAST = -1;
 INADDR_NONE      = -1;


 
Anatoly Podgoretsky ©   (2008-08-07 15:14) [7]

> Сергей М.  (07.08.2008 14:59:04)  [4]

Ну например в виде Cardinal в текстовом формате.


 
Rouse_ ©   (2008-08-07 15:16) [8]


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

И? Развивай мысль ;)


 
Anatoly Podgoretsky ©   (2008-08-07 15:16) [9]

> Dmitry S  (07.08.2008 15:13:06)  [6]

Все правильно INADDR_BROADCAST это -1 или в ИНЕТ виде 255.255.255.255 или #FFFFFFFF


 
Dmitry S ©   (2008-08-07 15:17) [10]


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

INADDR_BROADCAST = INADDR_NONE, а следовательно определить, что вернула функция невозможно, в чем и сложность автора.


 
Anatoly Podgoretsky ©   (2008-08-07 15:22) [11]

А никакой сложности и нет, просто автору в голову не приходить проверить это до вызова функции.
INADDR_NONE это результат функции
INADDR_BROADCAST это самый большой броадкаст адрес


 
Rouse_ ©   (2008-08-07 15:24) [12]


> INADDR_BROADCAST = INADDR_NONE

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

единственное различие между ними в наличие знака. INADDR_BROADCAST - это unsigned int равное 0хFFFFFFFF, а INADDR_NONE - это код ошибки которую возвращают Winsocket функции типа connect, имеет тип int и значение -1


 
Rouse_ ©   (2008-08-07 15:25) [13]

зы: с кодом ошибки я наверное переборщил ;)


 
Dmitry S ©   (2008-08-07 15:25) [14]

Это что, если я кину в инет пакет с адресом INADDR_BROADCAST, то он будет отправлен всем-всем компам инета?


 
Anatoly Podgoretsky ©   (2008-08-07 15:25) [15]

Диапазон все адресов это 2^32 и если какое то значение использовать как признак ошибки, то понятно, что его нельзя будет различить с реальным значением. Это же получается тот самый знаменитый, от стальной птицы, вопрос "Как очистить переменную Integer"


 
Dmitry S ©   (2008-08-07 15:27) [16]


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

К примеру адрес 0.0.0.0 имеет какое либо значение вообще?


 
Rouse_ ©   (2008-08-07 15:27) [17]


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

в пределах подсети


 
Anatoly Podgoretsky ©   (2008-08-07 15:27) [18]

> Rouse_  (07.08.2008 15:24:12)  [12]

Переборщил, код ошибки беззнаковое целое longword/dWord/Cardinal


 
Anatoly Podgoretsky ©   (2008-08-07 15:28) [19]

> Dmitry S  (07.08.2008 15:25:14)  [14]

Автор путает адреса с кодами ошибок, аппельсины с котлетами.


 
Rouse_ ©   (2008-08-07 15:28) [20]


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

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


 
Сергей М. ©   (2008-08-07 15:30) [21]


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


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

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

Да и какой идиот будет передавать IPv4-адрес не в Беркли-нотации ?
А если и найдутся такие, почему не дать им отлуп вида "адрес задан неверно" ?


 
Dmitry S ©   (2008-08-07 15:36) [22]


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

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


 
Anatoly Podgoretsky ©   (2008-08-07 15:38) [23]

> Dmitry S  (07.08.2008 15:27:16)  [16]

Имеет, это самая большая сеть, нулевая, вот к ней то и применяется данный адрес.


 
Rouse_ ©   (2008-08-07 15:40) [24]


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

В твоей есесно :))))


 
Anatoly Podgoretsky ©   (2008-08-07 15:40) [25]

> Rouse_  (07.08.2008 15:27:17)  [17]

В общем случае не верно. В рамках текущей маршрутизации, ничто не ограничивает посылать в любые сети. Просто в частном случае есть соглашение, что маршрутизаторы, особо (в обязательном порядке) смотрящие в Сеть не пропускают данные пакеты, но в тоже время это нормальное действие в локальных сетях.


 
Rouse_ ©   (2008-08-07 15:41) [26]


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

Скажем так: в большинстве случае верно, настроить сеть то конечно можно по разному :)


 
Anatoly Podgoretsky ©   (2008-08-07 15:42) [27]

> Сергей М.  (07.08.2008 15:30:21)  [21]

А я что по твоему предложил?
У него входящий параметр "255.255.255.255" вот его и надо проверять до вызова функции, при том не в любых нотациях, у него формат, согласно его же словам, четко зафиксирован.


 
Anatoly Podgoretsky ©   (2008-08-07 15:54) [28]

> Rouse_  (07.08.2008 15:41:26)  [26]

Кульхачкеры очень мечтают сделать PING 255.255.255.255 и задосить всю Сеть :-)


 
Dmitry S ©   (2008-08-07 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 ©   (2008-08-07 16:09) [30]

> Dmitry S  (07.08.2008 16:01:29)  [29]

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

А PING это не UDP и не даже TCP


 
ketmar ©   (2008-08-07 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 ©   (2008-08-07 16:33) [32]

> ketmar  (07.08.2008 16:28:31)  [31]

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


 
Пробежал...   (2008-08-07 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_ ©   (2008-08-07 16:37) [34]

0.0.0.0 зарезервирован как адрес роутера по умолчанию.


 
ketmar ©   (2008-08-07 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 ©   (2008-08-07 16:43) [36]


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

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


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

Тоже не факт.


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

Может быть винда определила, что адрес кривой, и не удосужилась заполнить данное поле, хотя бы нулями?


 
Сергей М. ©   (2008-08-07 16:44) [37]


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


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

Впрочем, вариантов-то не так много - либо имя хоста либо адрес)


 
Anatoly Podgoretsky ©   (2008-08-07 16:54) [38]

> Пробежал...  (07.08.2008 16:34:33)  [33]

Да не мучайся, тебе нужен этот адрес или нет?
Если не нужен считай что он невозможен INADDR_NONE и делов то.
Другое дело если с этим адресом надо работать, тут до inet_addr нужна предобработка.


 
Anatoly Podgoretsky ©   (2008-08-07 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 ©   (2008-08-07 16:58) [40]

> ketmar  (07.08.2008 16:38:35)  [35]

Не криво, если сеть 192.168.0.0/24 то глупо, если 192.168.0.0/16 то это реальный адрес, а не адрес броадкаста, тоже адрес сети. Все зависит от маски.


 
Сергей М. ©   (2008-08-07 16:58) [41]


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


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

Автор же утверждает, что ему заранее неизвестна нотация параметра.
На вход же inet_addr требуется подача полной или частичной Беркли-нотации


 
Anatoly Podgoretsky ©   (2008-08-07 17:01) [42]

> Сергей М.  (07.08.2008 16:44:37)  [37]

А еще есть кульхачкеры, которые могут указать как -1 или как 4294967295 или как #FFFFFFFF и так далее, но количество вариантов все равно маленькое.


 
Anatoly Podgoretsky ©   (2008-08-07 17:03) [43]

> Сергей М.  (07.08.2008 16:58:41)  [41]

Я обсуждаю предобработку только для одного адреса и пока в формате "255.255.255.255"
результатом преобразования будет правильный адрес, но данный адрес исключен из обработки в функции, он совпадает с кодом ошибки, это плата за чистую переменную!


 
Сергей М. ©   (2008-08-07 17:03) [44]


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


А могут еще в CIDR-нотации учудить)


 
Сергей М. ©   (2008-08-07 17:04) [45]


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


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


Ну это понятно.


 
Dmitry S ©   (2008-08-07 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 ©   (2008-08-07 17:12) [47]

У меня подозрение, что автор неправильно использует поле PHostEnt.h_addr_list.

К примеру, если допустить одну оплошность в использовании этого поля я получаю результат: h_addr_list: 100.183.59.0, что очень похоже на результат автора :)


 
Пробежал...   (2008-08-07 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 ©   (2008-08-07 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 ©   (2008-08-07 17:15) [50]


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

Давай код


 
Сергей М. ©   (2008-08-07 17:15) [51]


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


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

тут надо с чувством, с толком, с расстановкой, а у автора все на бегу происходит)


 
Dmitry S ©   (2008-08-07 17:19) [52]

Автор исправь
PInAddr(HostEn^.h_addr_list)^
на
PInAddr(HostEn^.h_addr_list^)^


 
Пробежал...   (2008-08-07 17:22) [53]

Да, забыл один раз разыименовать в коде... Поэтому такой косяк с GetHostByname... Разобрался.

Осталось только распознать, что inet_addr возвращает адрес броадкаста, а не ошибку ;( Зачем же так сделано то галимо...


 
Сергей М. ©   (2008-08-07 17:28) [54]


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


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

ну чем тебе этот "костыль" мешает - проверить, не представлен ли параметром именно этот адрес, дабы обойти при этой ситуации вызов inet_addr и конвертнуть его тремя строчками своего кода ?


 
Rouse_ ©   (2008-08-07 17:29) [55]


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

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


 
Dmitry S ©   (2008-08-07 17:34) [56]

А не проще использовать сразу gethostbyname и не парить мозг никому?


 
ketmar ©   (2008-08-07 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 ©   (2008-08-07 17:37) [58]


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

Предрассудки. Да и сервисы обычно вешают на .254 или .1-.10 :)


 
ketmar ©   (2008-08-07 17:41) [59]

>[58] Dmitry S © (2008-08-07 17:37:00)
не спорю, стандарта на это нет. но как-то не принято, и всё тут. %-)

---
Understanding is not required. Only obedience.


 
Пробежал...   (2008-08-07 18:07) [60]


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

хм... ступил что-то ;)
Просто у меня GetHostByName не работал... А тут действительно, чего париться ;)


 
Anatoly Podgoretsky ©   (2008-08-07 20:21) [61]

> Пробежал...  (07.08.2008 17:22:53)  [53]

Затем, что иначе нужен dWord на единицу больший чем FFFFFFFF,


 
Anatoly Podgoretsky ©   (2008-08-07 20:22) [62]

> ketmar  (07.08.2008 17:35:57)  [57]

Туда вешают админов.


 
ketmar ©   (2008-08-07 20:54) [63]

>[62] Anatoly Podgoretsky © (2008-08-07 20:22:00)
всех не перевешаете!

---
Understanding is not required. Only obedience.


 
Anatoly Podgoretsky ©   (2008-08-07 21:03) [64]

> ketmar  (07.08.2008 20:54:03)  [63]

Я помню этот лозунг


 
umbra ©   (2008-08-07 23:53) [65]


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

не совсем. Диапазон адресов бродкаста вычисляется из адреса сети и маски. обычно гораздо меньше.



Страницы: 1 2 вся ветка

Текущий архив: 2008.09.28;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.023 c
2-1219219486
sD
2008-08-20 12:04
2008.09.28
Работа с dxBarManager (DevExpress)


15-1218030841
Vlad Oshin
2008-08-06 17:54
2008.09.28
BDS 2006 при выгрузке остается в задачах...


11-1192803409
Сидор
2007-10-19 18:16
2008.09.28
WordWrap в KOLButton


3-1206562057
Fin
2008-03-26 23:07
2008.09.28
Узнать Значение счётчика


15-1217960331
AlexDan
2008-08-05 22:18
2008.09.28
Тоже о рычагах.. и о законе сохранения энергии..