/* problem is, inet_aton is historically quite, uh, lenient. * the following are all acceptable: * 0x7f000001 == 127.1 == 127.0.0.1.0 == 127.0.0.1 * btw: 127.0.0.x.y == 127.0.0.(x|y) * and: 10.1.1 == 10.1.0.1 (huh?!) * and: 10 == 0.0.0.10 (?!?!?) * The Berkeley people must have been so stoned that they are still high. */
tuhle perlu jsem nasel v IPv4 inet_aton.c Podle vyvrtek, ktere popisuje pan Satrapa, jim to vydrzelo fakt dlouho .-) Stesti ze internet je stejne na prd, takze nevadi ze nefunguje.
To, jak se zapisuje IPV4 adresa je mozna trochu komplikovane (vsak vas take nikdo nenuti pouzivat vsechny moznosti) ale nijak nepochopitelne. Pokud zapis adresy muze obsahovat i mene nez 4 komponenty, pak posledni cislo je "adresa pocitace" v ramci "site", kterou popisuji cisla predchozi - ve vasem prikladu jsou to zapisy ve tvaru 127.1 a 10.1.1 popisujici pocitac s adresou "1" v siti 127(.0.0.0) respektive 10.1(.0.0). Zvlastni pripad je cislo s jednou komponentou (tedy "zadna tecka") - v takovem pripade je toto cislo primo adresou (ve vasem pripade zapisy 0x7f000001 a 10, prvni je navic zapsany hexadecimalne). Uznavam, ze to neni tak jednoduche, jako proste A.B.C.D, ale neni na tom ani nic magickeho, sloziteho nebo nepochopitelneho. Samorejme, pokud vite o cem je rec - ale to plati pro vsechny vedomosti a nejen na Internetu.
Zapisy, ktere obsahuji vice nez 4 komponenty neznam - coz neznamena, ze takove pripustne nejsou - nicmene, samo BSD, pro ktere vlastne bylo toto rozhrani puvodne napsano zadne peti a vice-komponentni zapisy nezna a nepovazuje takove retezce za zapis IPv4 adresy.
Nevim, odkud jste citovany "povzdech" okopiroval, nicmene, troufam si k nemu konstatovat, jen tolik: "kdyz kod cehokoliv pise nekdo, kdo o tom moc nevi, to se pak dozije leckterych prekvapeni". Huh!
Pro komplexnost bych uz jen pripojil nekolik dalsich zcela legitimnich zapisu adresy: 196.0x10BEDA==196.1097434==196.16.190.218 a 127.0.0.63==127.63==127.0x3F==127.077 (ten, kdo by chtel nekdy psat vlastni implementaci inet_aton jiste vi, ze posledni zapis je oktalovy - a kdo to nevedel nemel by se do programovani takhle slozitych veci radeji poustet).
Co se tyce zapisu s peti komponenty - urcite jsem nesezral vsechnu moudrost. Ale v prostredi Internetu uz se pohybuji dost dlouho a troufam si tvrdit, ze nejsem laik a videl jsem uz lecos. Presto jsem jeste NIKDY pred vasim prispevkem nevidel, aby se treti adresa v subnetu 1.2.3.16/28 zapisovala jako 1.2.3.16.3 . Takova vec se obvykle zapisuje, kdyz uz, jako 1.2.3.19/28. Nicmene, takovy zapis uz neni IP adresa. To je IP adresa vcetne masky site. Jenze inet_aton() prevadi IP adresy - nikoli IP adresy vcetne masky site - tedy - inet_aton() takovy zapis znat nepotrebuje a typicky ani nezna (Your mileage may vary).
Nemohu nez zopakovat, ze na zaklade informaci z jedne manualove stranky pravdepodobne nic kompatibilniho nevznikne a tech prekvapeni si uzijete jeste hodne. A co teprv uzivatele takto vznikle knihovny ...
Nicmene, abych jen nekritizoval vase programatorske postupy - pro vasi informaci, tady citace casti jine manualove stranky k inet_aton. Ta sice obsahuje mene "huh!" nez ta vase, ale zato obsahuje kompletni popis pripustnych formatu. Snad vam to pomuze. Obzvlast bych upozornil na skutecnost, ze cisla v adresach NEMUSI byt zapsana dekadicky. Aby vas to pak zase nekdy neprekvapilo ...
INTERNET ADDRESSES
Values specified using the `.' notation take one of the following forms:
a.b.c.d
a.b.c
a.b
a
When four parts are specified, each is interpreted as a byte of data and assigned, from left to right, to the four bytes of an Internet address.
Note that when an Internet address is viewed as a 32-bit integer quantity
on the VAX the bytes referred to above appear as ``d.c.b.a''. That is, VAX bytes are ordered from right to left.
When a three part address is specified, the last part is interpreted as a 16-bit quantity and placed in the right-most two bytes of the network address. This makes the three part address format convenient for specifying Class B network addresses as ``128.net.host''.
When a two part address is supplied, the last part is interpreted as a 24-bit quantity and placed in the right most three bytes of the network address. This makes the two part address format convenient for specify- ing Class A network addresses as ``net.host''.
When only one part is given, the value is stored directly in the network address without any byte rearrangement.
All numbers supplied as ``parts'' in a `.' notation may be decimal, octal, or hexadecimal, as specified in the C language (i.e., a leading 0x or 0X implies hexadecimal; otherwise, a leading 0 implies octal; other- wise, the number is interpreted as decimal).
FreeBSD 4.9 June 17, 1996