Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];

Вниз

Нет отличия 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 то это реальный адрес, а не адрес броадкаста, тоже адрес сети. Все зависит от маски.



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

Форум: "Прочее";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.049 c
2-1218698459
kopernik21187
2008-08-14 11:20
2008.09.28
параметр SQL-запроса в ADOQuery


15-1218105060
Пробежал...
2008-08-07 14:31
2008.09.28
Нет отличия INADDR_NONE от INADDR_BROADCAST ;(


15-1217687510
BlueDragon
2008-08-02 18:31
2008.09.28
Ноутбук Dell


2-1219122526
kate158
2008-08-19 09:08
2008.09.28
сдвиг данных в dbgrid e на 1 вверх


2-1218633633
webpauk
2008-08-13 17:20
2008.09.28
Отображение компонентов на форме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский