-
Вот такая забубень, что 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' - а пакет в результате разойдется всем по броалкасту.
-
и еще конечно очень любопытно каким таким образом:
>GetHostByName над строкой '255.255.255.255' возвращает IP-
>адрес: '52.169.21.0'
очень очень интересно...
-
> Допустим, через мой модуль пытаются послать данные на адрес
> '255.255.255.255' - конечно, это неправильно так делать,
> но тем не менее работать то должно
Не в windows. И даже по подсети не проходит. В *nix всё ок.
-
> И более того, 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.
-
> адреса можно и в другом формате записывать, и вроде даже
> не через точку
Какую конкретно нотацию ты имеешь ввиду ?
-
У меня gethostbyname('255.255.255.255') возвращает в S_addr значение INADDR_NONE, так что что-то ты перемудрил :)
-
> Rouse_ © (07.08.08 15:04) [5]
INADDR_BROADCAST = -1;
INADDR_NONE = -1;
-
> Сергей М. (07.08.2008 14:59:04) [4]
Ну например в виде Cardinal в текстовом формате.
-
> INADDR_BROADCAST = -1;
> INADDR_NONE = -1;
И? Развивай мысль ;)
-
> Dmitry S (07.08.2008 15:13:06) [6]
Все правильно INADDR_BROADCAST это -1 или в ИНЕТ виде 255.255.255.255 или #FFFFFFFF
-
> Rouse_ © (07.08.08 15:16) [8]
INADDR_BROADCAST = INADDR_NONE, а следовательно определить, что вернула функция невозможно, в чем и сложность автора.
-
А никакой сложности и нет, просто автору в голову не приходить проверить это до вызова функции.
INADDR_NONE это результат функции
INADDR_BROADCAST это самый большой броадкаст адрес
-
> INADDR_BROADCAST = INADDR_NONE
не совсем верно:
единственное различие между ними в наличие знака. INADDR_BROADCAST - это unsigned int равное 0хFFFFFFFF, а INADDR_NONE - это код ошибки которую возвращают Winsocket функции типа connect, имеет тип int и значение -1
-
зы: с кодом ошибки я наверное переборщил ;)
-
Это что, если я кину в инет пакет с адресом INADDR_BROADCAST, то он будет отправлен всем-всем компам инета?
-
Диапазон все адресов это 2^32 и если какое то значение использовать как признак ошибки, то понятно, что его нельзя будет различить с реальным значением. Это же получается тот самый знаменитый, от стальной птицы, вопрос "Как очистить переменную Integer"
-
> Anatoly Podgoretsky © (07.08.08 15:25) [15]
К примеру адрес 0.0.0.0 имеет какое либо значение вообще?
-
> то он будет отправлен всем-всем компам инета?
в пределах подсети
-
> Rouse_ (07.08.2008 15:24:12) [12]
Переборщил, код ошибки беззнаковое целое longword/dWord/Cardinal
-
> Dmitry S (07.08.2008 15:25:14) [14]
Автор путает адреса с кодами ошибок, аппельсины с котлетами.