package Ġcom . advis er . ip address . kotlin Ċ Ċ import Ġjava . math . BigInteger Ċ Ċ val Ġx 8 0 0 0 0 0 0 0 Ġ= ĠBigInteger . valueOf ( 2 1 4 7 4 8 3 6 4 8 L ) Ċ val Ġxc 0 0 0 0 0 0 0 Ġ= ĠBigInteger . valueOf ( 3 2 2 1 2 2 5 4 7 2 L ) Ċ val Ġx e 0 0 0 0 0 0 0 Ġ= ĠBigInteger . valueOf ( 3 7 5 8 0 9 6 3 8 4 L ) Ċ Ċ val Ġis _ private Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠIP Address . parse (" 1 0 . 0 . 0 . 0 / 8 "). unwrap (), ĊĠĠĠĠĠĠĠ ĠIP Address . parse (" 1 6 9 . 2 5 4 . 0 . 0 / 1 6 "). unwrap (), ĊĠĠĠĠĠĠĠ ĠIP Address . parse (" 1 7 2 . 1 6 . 0 . 0 / 1 2 "). unwrap (), ĊĠĠĠĠĠĠĠ ĠIP Address . parse (" 1 9 2 . 1 6 8 . 0 . 0 / 1 6 "). unwrap () Ċ ) ĊĊ Ċ class ĠIp V 4 Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġipv 4 _ is _ private : ĠV t Bool Ġ= Ġ{ Ġmy Ġ-> Ġis _ private . find Ġ{ Ġi Ġ-> Ġi . includes ( my ) Ġ} Ġ!= Ġnull Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġipv 4 _ is _ loop back : ĠV t Bool Ġ= Ġ{ Ġmy Ġ-> ĠIP Address . parse (" 1 2 7 . 0 . 0 . 0 / 8 "). unwrap (). includes ( my ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġto _ ipv 6 : ĠV t IPAddress Ġ= Ġ{ Ġia Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIP Address ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIp Bits . V 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger . ZERO . add ( ia . host _ address ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrefix 1 2 8 . create ( ia . prefix . num ). unwrap (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIp V 6 . ipv 6 _ is _ private , ĠIp V 6 . ipv 6 _ is _ loop back , ĠIp V 6 . ipv 6 _ to _ ipv 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom _ u 3 2 ( addr : ĠLong , Ġ_ prefix : ĠInt ): ĠResult < IPAddress > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= ĠPrefix 3 2 . create (_ prefix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefix . is Err ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Err ( prefix . unwrap Err ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Ok ( IPAddress ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIp Bits . V 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger . valueOf ( addr ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix . unwrap (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġipv 4 _ is _ private , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġipv 4 _ is _ loop back , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto _ ipv 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( str : ĠString ): ĠResult < IPAddress > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit ted Ġ= ĠIP Address . split _ at _ slash ( str ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! IPAddress . is _ valid _ ipv 4 ( split ted . addr )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Err (" Invalid ĠIP Ġ${ str }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġip _ prefix _ num Ġ= ĠResult . Ok ( 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split ted . net mask Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġnet mask Ġis Ġdefined ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip _ prefix _ num Ġ= ĠIP Address . parse _ net mask _ to _ prefix ( split ted . net mask ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip _ prefix _ num . is Err ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Err ( ip _ prefix _ num . unwrap Err ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġip _ prefix . ip _ bits . version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip _ prefix Ġ= ĠPrefix 3 2 . create ( ip _ prefix _ num . unwrap ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip _ prefix . is Err ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Err ( ip _ prefix . unwrap Err ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit _ u 3 2 Ġ= ĠIP Address . split _ to _ u 3 2 ( split ted . addr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split _ u 3 2 . is Err ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Err ( split _ u 3 2 . unwrap Err ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Ok ( IPAddress ( Ip Bits . V 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger . valueOf ( split _ u 3 2 . unwrap ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip _ prefix . unwrap (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġipv 4 _ is _ private , Ġipv 4 _ is _ loop back , Ġto _ ipv 6 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠChecks Ġwhether Ġthe Ġip Ġaddress Ġbelongs Ġto Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠRFC Ġ 7 9 1 ĠCLASS ĠA Ġnetwork , Ġno Ġmatter ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwhat Ġthe Ġsubnet Ġmask Ġis . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 0 . 0 . 0 . 1 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . a ? ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġis _ class _ a ( my : ĠIP Address ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy . is _ ipv 4 () Ġ&& Ġmy . host _ address . compareTo ( x 8 0 0 0 0 0 0 0 ) Ġ< Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠChecks Ġwhether Ġthe Ġip Ġaddress Ġbelongs Ġto Ġa ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠRFC Ġ 7 9 1 ĠCLASS ĠB Ġnetwork , Ġno Ġmatter ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwhat Ġthe Ġsubnet Ġmask Ġis . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 1 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . b ? ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġfun Ġis _ class _ b ( my : ĠIP Address ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy . is _ ipv 4 () Ġ&& Ġx 8 0 0 0 0 0 0 0 . compareTo ( my . host _ address ) Ġ<= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmy . host _ address . compareTo ( xc 0 0 0 0 0 0 0 ) Ġ< Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠChecks Ġwhether Ġthe Ġip Ġaddress Ġbelongs Ġto Ġa ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠRFC Ġ 7 9 1 ĠCLASS ĠC Ġnetwork , Ġno Ġmatter ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwhat Ġthe Ġsubnet Ġmask Ġis . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 . 1 / 3 0 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . c ? ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġfun Ġis _ class _ c ( my : ĠIP Address ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy . is _ ipv 4 () Ġ&& Ġxc 0 0 0 0 0 0 0 . compareTo ( my . host _ address ) Ġ<= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmy . host _ address . compareTo ( xe 0 0 0 0 0 0 0 ) Ġ< Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġis _ private ( my : Ġ& IPAddress ) Ġ-> Ġbool Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġfor Ġi Ġin Ġvec ![ IPv 4 :: new (" 1 0 . 0 . 0 . 0 / 8 "), ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIPv 4 :: new (" 1 7 2 . 1 6 . 0 . 0 / 1 2 "), ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIPv 4 :: new (" 1 9 2 . 1 6 8 . 0 . 0 / 1 6 ")] Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġif Ġmy . includes (& i ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġdns _ reverse ( my : Ġ& IPAddress ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġlet Ġparts Ġ= Ġself . ip _ bits . parts (& my . host _ address ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġreturn ĠString . format (" {}. {}. {}. {}. in - addr . ar pa ", ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . get ( 3 ), ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . get ( 2 ), ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . get ( 1 ), ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . get ( 0 )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġto _ ipv 4 _ str ( value : Ġu 3 2 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠString . format (" {}. {}. {}. {}", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġ( value Ġ>> Ġ 2 4 ) Ġ& Ġ 0 xff , ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġ( value Ġ>> Ġ 1 6 ) Ġ& Ġ 0 xff , ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġ( value Ġ>> Ġ 8 ) Ġ& Ġ 0 xff , ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġvalue Ġ& Ġ 0 xff ) ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġaddress Ġportion Ġof Ġthe ĠIPv 4 Ġobject ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġas Ġa Ġstring . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 4 / 2 2 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . address ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 0 . 4 " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġaddress (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġreturn Ġself . address ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġprefix Ġportion Ġof Ġthe ĠIPv 4 Ġobject ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġas Ġa ĠIP Address :: Prefix 3 2 Ġobject ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 4 / 2 2 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . prefix ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 2 2 ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . prefix . class ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> ĠIP Address :: Prefix 3 2 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġprefix (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġreturn Ġself . prefix ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠSet Ġa Ġnew Ġprefix Ġnumber Ġfor Ġthe Ġobject ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThis Ġis Ġuseful Ġif Ġyou Ġwant Ġto Ġchange Ġthe Ġprefix ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġto Ġan Ġobject Ġcreated Ġwith ĠIPv 4 :: parse _ u 3 2 Ġor ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġif Ġthe Ġobject Ġwas Ġcreated Ġusing Ġthe Ġclass ful ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġmask . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġputs Ġip ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 7 2 . 1 6 . 1 0 0 . 4 / 1 6 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . prefix Ġ= Ġ 2 2 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġputs Ġip ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 7 2 . 1 6 . 1 0 0 . 4 / 2 2 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġset _ prefix (& mut Ġself , Ġnum : Ġu 8 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . prefix Ġ= ĠPrefix 3 2 :: new ( num ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġaddress Ġas Ġan Ġarray Ġof Ġdecimal Ġvalues ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . oct ets ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ[ 1 7 2 , Ġ 1 6 , Ġ 1 0 0 , Ġ 4 ] ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġoct ets (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . oct ets ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġa Ġstring Ġwith Ġthe Ġaddress Ġportion Ġof ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġthe ĠIPv 4 Ġobject ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 4 / 2 2 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . to _ s ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 0 . 4 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġto _ s (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . address ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġcompressed (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . address ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġa Ġstring Ġwith Ġthe ĠIP Ġaddress Ġin Ġcanonical ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġform . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 4 / 2 2 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . to _ string ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 0 . 4 / 2 2 " ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġto _ string (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠString . format ("{} /{} ", Ġself . address . to _ s , Ġself . prefix . to _ s ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġprefix Ġas Ġa Ġstring Ġin ĠIP Ġformat ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 4 / 2 2 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . net mask ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 2 5 5 . 2 5 5 . 2 5 2 . 0 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġnet mask (& self ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . prefix . to _ ip () ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠLike ĠIPv 4 // Ġprefix = , Ġthis Ġmethod Ġallow Ġyou Ġto ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġchange Ġthe Ġprefix Ġ/ Ġnet mask Ġof Ġan ĠIP Ġaddress ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġobject . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġputs Ġip ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 7 2 . 1 6 . 1 0 0 . 4 / 1 6 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . net mask Ġ= Ġ" 2 5 5 . 2 5 5 . 2 5 2 . 0 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġputs Ġip ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 7 2 . 1 6 . 1 0 0 . 4 / 2 2 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġset _ net mask (& self , Ġaddr : Ġ& String ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . prefix Ġ= ĠPrefix 3 2 :: parse _ net mask _ to _ prefix ( addr ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġaddress Ġportion Ġin Ġunsigned ĊĠĠĠĠĠĠĠ Ġ// ĠĠ 3 2 Ġbits Ġinteger Ġformat . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThis Ġmethod Ġis Ġidentical Ġto Ġthe ĠC Ġfunction ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġinet _ pton Ġto Ġcreate Ġa Ġ 3 2 Ġbits Ġaddress Ġfamily ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġstructure . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 0 . 0 . 0 . 0 / 8 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . to _ i ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 6 7 7 7 2 1 6 0 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġu 3 2 () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . ip 3 2 ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġto _ i () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . ip 3 2 ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġto _ u 3 2 () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . ip 3 2 ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġaddress Ġportion Ġof Ġan ĠIPv 4 Ġobject ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġin Ġa Ġnetwork Ġbyte Ġorder Ġformat . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 1 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . data ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ"\ 2 5 4 \ 0 2 0 \ n \ 0 0 1 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIt Ġis Ġusually Ġused Ġto Ġinclude Ġan ĠIP Ġaddress ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġin Ġa Ġdata Ġpacket Ġto Ġbe Ġsent Ġover Ġa Ġsocket ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġa Ġ= ĠSocket . open ( params ) Ġ// Ġ Ġsocket Ġdetails Ġhere ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 0 . 1 . 1 . 0 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbinary _ data Ġ= Ġ[" Address : Ġ" ]. pack (" a * ") Ġ+ Ġip . data ĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ// Ġ ĠSend Ġbinary Ġdata ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġa . puts Ġbinary _ data ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġdata (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . ip 3 2 ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġoct et Ġspecified Ġby Ġindex ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 5 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 7 2 ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip [ 1 ] ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 6 ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip [ 2 ] ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip [ 3 ] ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 5 0 ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġget (& self , Ġindex : Ġu 8 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . oct ets . get ( index ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġoct et (& self , Ġindex : Ġu 8 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . oct ets . get ( index ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġaddress Ġportion Ġof Ġan ĠIP Ġin Ġbinary Ġformat , ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġas Ġa Ġstring Ġcontaining Ġa Ġsequence Ġof Ġ 0 Ġand Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 2 7 . 0 . 0 . 1 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . bits ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġbits (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . ip 3 2 . to _ string () ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġbroadcast Ġaddress Ġfor Ġthe Ġgiven ĠIP . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 6 4 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . broadcast . to _ s ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 . 2 5 5 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġbroadcast (& self ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠIPv 4 :: parse _ u 3 2 ( self . broadcast _ u 3 2 , Ġself . prefix ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠChecks Ġif Ġthe ĠIP Ġaddress Ġis Ġactually Ġa Ġnetwork ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 6 4 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . network ? ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġfalse ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 6 4 / 2 6 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . network ? ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġis _ network () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ( self . prefix . num Ġ< Ġ 3 2 ) Ġ&& Ġ( self . ip 3 2 Ġ| Ġself . prefix . to _ u 3 2 Ġ== Ġself . prefix . to _ u 3 2 ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġa Ġnew ĠIPv 4 Ġobject Ġwith Ġthe Ġnetwork Ġnumber ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġfor Ġthe Ġgiven ĠIP . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 6 4 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . network . to _ s ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 . 0 " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġnetwork () ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . class . parse _ u 3 2 ( self . network _ u 3 2 , Ġprefix ) ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġa Ġnew ĠIPv 4 Ġobject Ġwith Ġthe ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġfirst Ġhost ĠIP Ġaddress Ġin Ġthe Ġrange . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : Ġgiven Ġthe Ġ 1 9 2 . 1 6 8 . 1 0 0 . 0 / 2 4 Ġnetwork , Ġthe Ġfirst ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġhost ĠIP Ġaddress Ġis Ġ 1 9 2 . 1 6 8 . 1 0 0 . 1 . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 0 . 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . first . to _ s ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 9 2 . 1 6 8 . 1 0 0 . 1 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThe Ġobject ĠIP Ġdoesn 't Ġneed Ġto Ġbe Ġa Ġnetwork : Ġthe Ġmethod ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġautomatically Ġgets Ġthe Ġnetwork Ġnumber Ġfrom Ġit ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 0 . 5 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . first . to _ s ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 9 2 . 1 6 8 . 1 0 0 . 1 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġfirst (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠIPv 4 :: parse _ u 3 2 ( self . network _ u 3 2 + 1 , Ġself . prefix ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠLike Ġits Ġsibling Ġmethod ĠIPv 4 // Ġfirst , Ġthis Ġmethod ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġreturns Ġa Ġnew ĠIPv 4 Ġobject Ġwith Ġthe ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġlast Ġhost ĠIP Ġaddress Ġin Ġthe Ġrange . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : Ġgiven Ġthe Ġ 1 9 2 . 1 6 8 . 1 0 0 . 0 / 2 4 Ġnetwork , Ġthe Ġlast ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġhost ĠIP Ġaddress Ġis Ġ 1 9 2 . 1 6 8 . 1 0 0 . 2 5 4 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 0 . 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . last . to _ s ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 9 2 . 1 6 8 . 1 0 0 . 2 5 4 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThe Ġobject ĠIP Ġdoesn 't Ġneed Ġto Ġbe Ġa Ġnetwork : Ġthe Ġmethod ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġautomatically Ġgets Ġthe Ġnetwork Ġnumber Ġfrom Ġit ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 0 . 5 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . last . to _ s ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 9 2 . 1 6 8 . 1 0 0 . 2 5 4 " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġlast (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠIPv 4 :: parse _ u 3 2 ( self . broadcast _ u 3 2 - 1 , Ġself . prefix ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIter ates Ġover Ġall Ġthe Ġhosts ĠIP Ġaddresses Ġfor Ġthe Ġgiven ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġnetwork Ġ( or ĠIP Ġaddress ). ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 0 . 0 . 0 . 1 / 2 9 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . each _ host Ġdo Ġ| i | ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġp Ġi . to _ s ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġend ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 1 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 2 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 3 " ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 4 " ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 5 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 6 " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġeach _ host (& self , Ġfn : Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ( self . network _ u 3 2 + 1 .. self . broadcast _ u 3 2 - 1 ). each Ġdo Ġ| i | ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġyield Ġself . class . parse _ u 3 2 ( i , Ġ@ prefix ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġend ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIter ates Ġover Ġall Ġthe ĠIP Ġaddresses Ġfor Ġthe Ġgiven ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġnetwork Ġ( or ĠIP Ġaddress ). ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThe Ġobject Ġy ielded Ġis Ġa Ġnew ĠIPv 4 Ġobject Ġcreated ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġfrom Ġthe Ġiteration . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 0 . 0 . 0 . 1 / 2 9 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . each Ġdo Ġ| i | ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġp Ġi . address ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġend ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 0 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 1 " ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 2 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 3 " ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 4 " ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 5 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 6 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 7 " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġeach (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ( self . network _ u 3 2 .. self . broadcast _ u 3 2 ). each Ġdo Ġ| i | ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġyield Ġself . class . parse _ u 3 2 ( i , Ġ@ prefix ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġend ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠSp aces hip Ġoperator Ġto Ġcompare ĠIPv 4 Ġobjects ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠComp aring ĠIPv 4 Ġaddresses Ġis Ġuseful Ġto Ġord inate ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġthem Ġinto Ġlists Ġthat Ġmatch Ġour Ġintu itive ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġper ception Ġof Ġordered ĠIP Ġaddresses . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThe Ġfirst Ġcomparison Ġcriteria Ġis Ġthe Ġu 3 2 Ġvalue . ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠFor Ġexample , Ġ 1 0 . 1 0 0 . 1 0 0 . 1 Ġwill Ġbe Ġconsidered ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġto Ġbe Ġless Ġthan Ġ 1 7 2 . 1 6 . 0 . 1 , Ġbecause , Ġin Ġa Ġordered Ġlist , ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwe Ġexpect Ġ 1 0 . 1 0 0 . 1 0 0 . 1 Ġto Ġcome Ġbefore Ġ 1 7 2 . 1 6 . 0 . 1 . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThe Ġsecond Ġcriteria , Ġin Ġcase Ġtwo ĠIPv 4 Ġobjects ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġhave Ġidentical Ġaddresses , Ġis Ġthe Ġprefix . ĠAn Ġhigher ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġprefix Ġwill Ġbe Ġconsidered Ġgreater Ġthan Ġa Ġlower ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġprefix . ĠThis Ġis Ġbecause Ġwe Ġexpect Ġto Ġsee ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ 1 0 . 1 0 0 . 1 0 0 . 0 / 2 4 Ġcome Ġbefore Ġ 1 0 . 1 0 0 . 1 0 0 . 0 / 2 5 . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 1 Ġ= ĠIP Address Ġ" 1 0 . 1 0 0 . 1 0 0 . 1 / 8 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 2 Ġ= ĠIP Address Ġ" 1 7 2 . 1 6 . 0 . 1 / 1 6 " ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 3 Ġ= ĠIP Address Ġ" 1 0 . 1 0 0 . 1 0 0 . 1 / 1 6 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 1 Ġ< Ġip 2 ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 1 Ġ> Ġip 3 ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġfalse ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ[ ip 1 , ip 2 , ip 3 ]. sort . map {| i | Ġi . to _ string } ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ[" 1 0 . 1 0 0 . 1 0 0 . 1 / 8 "," 1 0 . 1 0 0 . 1 0 0 . 1 / 1 6 "," 1 7 2 . 1 6 . 0 . 1 / 1 6 "] ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġcmp (& self , Ġo th : ĠIPv 4 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġif Ġself . to _ u 3 2 () Ġ== Ġo th . to _ u 3 2 () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġreturn Ġself . prefix . num Ġ- Ġo th . prefix . num ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . to _ u 3 2 () Ġ- Ġo th . to _ u 3 2 () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġnumber Ġof ĠIP Ġaddresses Ġincluded ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġin Ġthe Ġnetwork . ĠIt Ġalso Ġcounts Ġthe Ġnetwork ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġaddress Ġand Ġthe Ġbroadcast Ġaddress . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 0 . 0 . 0 . 1 / 2 9 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . size ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 8 ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġsize (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ 2 Ġ** Ġself . prefix . host _ prefix () ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġan Ġarray Ġwith Ġthe ĠIP Ġaddresses Ġof ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġall Ġthe Ġhosts Ġin Ġthe Ġnetwork . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 0 . 0 . 0 . 1 / 2 9 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . hosts . map Ġ{| i | Ġi . address } ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ[" 1 0 . 0 . 0 . 1 ", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ Ġ" 1 0 . 0 . 0 . 2 ", ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ Ġ" 1 0 . 0 . 0 . 3 ", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ Ġ" 1 0 . 0 . 0 . 4 ", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ Ġ" 1 0 . 0 . 0 . 5 ", ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ Ġ" 1 0 . 0 . 0 . 6 "] ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġhosts (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . to _ a [ 1 .. - 2 ] ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġnetwork Ġnumber Ġin ĠUnsigned Ġ 3 2 bits Ġformat ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 0 . 0 . 0 . 1 / 2 9 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . network _ u 3 2 ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 6 7 7 7 2 1 6 0 ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġnetwork _ u 3 2 (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . ip 3 2 Ġ& Ġself . prefix . to _ u 3 2 () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe Ġbroadcast Ġaddress Ġin ĠUnsigned Ġ 3 2 bits Ġformat ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP address (" 1 0 . 0 . 0 . 1 / 2 9 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . broadcast _ u 3 2 ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ 1 6 7 7 7 2 1 6 7 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġbroadcast _ u 3 2 (& self ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . network _ u 3 2 Ġ+ Ġself . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠChecks Ġwhether Ġa Ġsubnet Ġincludes Ġthe Ġgiven ĠIP Ġaddress . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠAccept s Ġan ĠIP Address :: IPv 4 Ġobject . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 . 1 0 0 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġaddr Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 . 1 0 2 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . include ? Ġaddr ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . include ? ĠIP Address (" 1 7 2 . 1 6 . 0 . 4 8 / 1 6 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġfalse ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġinclude ? (& self , Ġo th : ĠIPv 4 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . prefix . num Ġ<= Ġo th . prefix . num Ġ&& ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . network _ u 3 2 Ġ== Ġ( oth . to _ u 3 2 () Ġ& Ġself . prefix . to _ u 3 2 ()) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠChecks Ġwhether Ġa Ġsubnet Ġincludes Ġall Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġgiven ĠIPv 4 Ġobjects . ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 . 1 0 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġaddr 1 Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 . 1 0 2 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġaddr 2 Ġ= ĠIP Address (" 1 9 2 . 1 6 8 . 1 0 . 1 0 3 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . include _ all ?( addr 1 , addr 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġinclude _ all ? (* others ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġothers . all ? Ġ{| oth | Ġinclude ?( oth )} ĊĠĠĠĠĠĠĠ Ġ// Ġend ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠChecks Ġif Ġan ĠIPv 4 Ġaddress Ġobjects Ġbelongs ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġto Ġa Ġprivate Ġnetwork ĠRFC 1 9 1 8 ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address Ġ" 1 0 . 1 . 1 . 1 / 2 4 " ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . private ? ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe ĠIP Ġaddress Ġin Ġin - addr . ar pa Ġformat ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġfor ĠDNS Ġlook ups ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 0 . 5 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . reverse ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 5 0 . 1 0 0 . 1 6 . 1 7 2 . in - addr . ar pa " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġreverse (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġreturn ĠString . format (" {}. {}. {}. {}. in - addr . ar pa ", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġself . oct ets . get ( 3 ), Ġself . oct ets . get ( 2 ), ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġself . oct ets . get ( 1 ), Ġself . oct ets . get ( 0 )) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġar pa (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġreturn Ġself . reverse () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġthe ĠIP Ġaddress Ġin Ġin - addr . ar pa Ġformat ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġfor ĠDNS ĠDomain Ġdefinition Ġentries Ġlike ĠSO A ĠRecords ĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 7 . 1 0 0 . 5 0 / 1 5 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . dns _ rev _ domains ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ[" 1 6 . 1 7 2 . in - addr . ar pa "," 1 7 . 1 7 2 . in - addr . ar pa "] ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġdns _ rev _ domains (& self ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġlet Ġmut Ġnet Ġ= Ġ[ Ġself . network Ġ] ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġlet Ġmut Ġcut Ġ= Ġ 4 Ġ- Ġ( self . prefix . num / 8 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġif Ġ( self . prefix . num Ġ<= Ġ 8 ) Ġ{ Ġ// Ġ Ġedge Ġcase Ġclass Ġa ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġcut Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} Ġelse Ġif Ġ( self . prefix . num Ġ> Ġ 2 4 ) Ġ{ Ġ// Ġ Ġedge Ġcase Ġclass Ġc ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġcut Ġ= Ġ 1 ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġnet Ġ= Ġ[ network . super net ( 2 4 )] ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( self . prefix . num Ġ< Ġ 2 4 Ġ&& Ġ( self . prefix . num Ġ% Ġ 8 ) Ġ!= Ġ 0 ) Ġ{ Ġ// Ġ Ġcase Ġclass Ġless ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġcut Ġ= Ġ 3 -( self . prefix . num / 8 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġnet Ġ= Ġnetwork . subnet ( self . prefix . num + 1 ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġreturn Ġnet . map (| n | Ġn . reverse . split ('. ')[ cut Ġ.. Ġ- 1 ]. join ('. ')) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠSpl its Ġa Ġnetwork Ġinto Ġdifferent Ġsubnet s ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIf Ġthe ĠIP ĠAddress Ġis Ġa Ġnetwork , Ġit Ġcan Ġbe Ġdivided Ġinto ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġmultiple Ġnetworks . ĠIf Ġ+ self + Ġis Ġnot Ġa Ġnetwork , Ġthis ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġmethod Ġwill Ġcalculate Ġthe Ġnetwork Ġfrom Ġthe ĠIP Ġand Ġthen ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġsubnet Ġit . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIf Ġ+ subnet s + Ġis Ġan Ġpower Ġof Ġtwo Ġnumber , Ġthe Ġresulting ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġnetworks Ġwill Ġbe Ġdivided Ġeven ly Ġfrom Ġthe Ġsuper net . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġnetwork Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġnetwork Ġ/ Ġ 4 ĠĠ Ġ// Ġ Ġimplies Ġmap {| i | Ġi . to _ string } ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ[" 1 7 2 . 1 6 . 1 0 . 0 / 2 6 ", ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġ" 1 7 2 . 1 6 . 1 0 . 6 4 / 2 6 ", ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġ" 1 7 2 . 1 6 . 1 0 . 1 2 8 / 2 6 ", ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġ" 1 7 2 . 1 6 . 1 0 . 1 9 2 / 2 6 "] ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIf Ġ+ num + Ġis Ġany Ġother Ġnumber , Ġthe Ġsuper net Ġwill Ġbe ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġdivided Ġinto Ġsome Ġnetworks Ġwith Ġa Ġeven Ġnumber Ġof Ġhosts Ġand ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġother Ġnetworks Ġwith Ġthe Ġremaining Ġaddresses . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġnetwork Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġnetwork Ġ/ Ġ 3 ĠĠ Ġ// Ġ Ġimplies Ġmap {| i | Ġi . to _ string } ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ[" 1 7 2 . 1 6 . 1 0 . 0 / 2 6 ", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġ" 1 7 2 . 1 6 . 1 0 . 6 4 / 2 6 ", ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġ" 1 7 2 . 1 6 . 1 0 . 1 2 8 / 2 5 "] ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġan Ġarray Ġof ĠIPv 4 Ġobjects ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġsplit ( my Ġ: Ġ& IPAddress , Ġsubnet s : Ġusize ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġif Ġsubnet s Ġ<= Ġ 1 Ġ|| Ġ( 1 << self . prefix . host _ prefix ()) Ġ<= Ġsubnet s Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġreturn ĠErr ( String . format (" Value Ġ{} Ġout Ġof Ġrange ", Ġsubnet s )) ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġlet Ġmut Ġnetworks Ġ= Ġself . subnet ( self . new prefix ( subnet s )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġif Ġ( networks . len () Ġ!= Ġsubnet s ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġnetworks Ġ= Ġsum _ first _ found ( networks ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġreturn Ġnetworks ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġalias _ method Ġ: /, Ġ: split ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturns Ġa Ġnew ĠIPv 4 Ġobject Ġfrom Ġthe Ġsuper net ting ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġof Ġthe Ġinstance Ġnetwork . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠSuper net ting Ġis Ġsimilar Ġto Ġsubnet ting , Ġexcept ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġthat Ġyou Ġgetting Ġas Ġa Ġresult Ġa Ġnetwork Ġwith Ġa ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġsmaller Ġprefix Ġ( big ger Ġhost Ġspace ). ĠFor Ġexample , ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġgiven Ġthe Ġnetwork ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġyou Ġcan Ġsuper net Ġit Ġwith Ġa Ġnew Ġ/ 2 3 Ġprefix ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . super net ( 2 3 ). to _ string ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 . 0 / 2 3 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠHowever Ġif Ġyou Ġsuper net Ġit Ġwith Ġa Ġ/ 2 2 Ġprefix , Ġthe ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġnetwork Ġaddress Ġwill Ġchange : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . super net ( 2 2 ). to _ string ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 8 . 0 / 2 2 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIf Ġ+ new _ prefix + Ġis Ġless Ġthan Ġ 1 , Ġreturns Ġ 0 . 0 . 0 . 0 / 0 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġsuper net (& self , Ġnew _ prefix : Ġu 8 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġif Ġ( new _ prefix Ġ>= Ġself . prefix . num ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġreturn ĠErr ( String . format (" New Ġprefix Ġmust Ġbe Ġsmaller Ġthan Ġexisting Ġprefix : Ġ{} Ġ>= Ġ{}", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew _ prefix , Ġself . prefix . num )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġif Ġnew _ prefix Ġ< Ġ 1 Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġreturn ĠOk ( IPv 4 :: new (" 0 . 0 . 0 . 0 / 0 ")) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġreturn ĠOk ( IPv 4 :: new ( String . format ("{} /{} ", Ġself . address , Ġself . prefix . num ))) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThis Ġmethod Ġimplements Ġthe Ġsubnet ting Ġfunction ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġsimilar Ġto Ġthe Ġone Ġdescribed Ġin ĠRFC 3 5 3 1 . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠBy Ġspecifying Ġa Ġnew Ġprefix , Ġthe Ġmethod Ġcalculates ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġthe Ġnetwork Ġnumber Ġfor Ġthe Ġgiven ĠIPv 4 Ġobject ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġand Ġcalculates Ġthe Ġsubnet s Ġassociated Ġto Ġthe Ġnew ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġprefix . ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠFor Ġexample , Ġgiven Ġthe Ġfollowing Ġnetwork : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address Ġ" 1 7 2 . 1 6 . 1 0 . 0 / 2 4 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwe Ġcan Ġcalculate Ġthe Ġsubnet s Ġwith Ġa Ġ/ 2 6 Ġprefix ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . subnet s ( 2 6 ). map (&: to _ string ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ[" 1 7 2 . 1 6 . 1 0 . 0 / 2 6 ", Ġ" 1 7 2 . 1 6 . 1 0 . 6 4 / 2 6 ", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġ" 1 7 2 . 1 6 . 1 0 . 1 2 8 / 2 6 ", Ġ" 1 7 2 . 1 6 . 1 0 . 1 9 2 / 2 6 "] ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThe Ġresulting Ġnumber Ġof Ġsubnet s Ġwill Ġof Ġcourse Ġalways Ġbe ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġa Ġpower Ġof Ġtwo . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġsubnet (& self , Ġsub prefix : Ġu 8 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġif Ġ( sub prefix Ġ<= Ġself . prefix . num Ġ|| Ġ 3 2 Ġ<= Ġsub prefix ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġreturn ĠErr ( String . format (" New Ġprefix Ġmust Ġbe Ġbetween Ġ{} Ġand Ġ 3 2 ", Ġsub prefix )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġlet Ġmut Ġret Ġ= ĠVec :: new () ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġfor Ġ( i Ġ= Ġ 0 ; Ġi Ġ< Ġ( 1 Ġ<< Ġ( sub prefix - self . prefix . num )); Ġ++ i ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġret . push ( IPv 4 :: parse _ u 3 2 ( self . network _ u 3 2 +( i *( 1 <<( 3 2 - sub prefix ))), Ġsub prefix )) ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠReturn Ġthe Ġip Ġaddress Ġin Ġa Ġformat Ġcompatible ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwith Ġthe ĠIPv 6 ĠM apped ĠIPv 4 Ġaddresses ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 1 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . to _ ipv 6 ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" ac 1 0 : 0 a 0 1 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġto _ ipv 6 ( my : Ġ& IPAddress ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġlet Ġpart _ mod Ġ= ĠBig Uint :: one () Ġ<< Ġ 1 6 ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġreturn ĠString . format (" {: 0 4 x }:{ : 0 4 x }", ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( my . host _ address Ġ>> Ġ 1 6 ). mod _ floor (& part _ mod ). to _ u 1 6 (). unwrap (), ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy . host _ address . mod _ floor (& part _ mod ). to _ u 1 6 (). unwrap ()) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠCreates Ġa Ġnew ĠIPv 4 Ġobject Ġfrom Ġan ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġunsigned Ġ 3 2 bits Ġinteger . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address :: IPv 4 :: parse _ u 3 2 ( 1 6 7 7 7 2 1 6 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . prefix Ġ= Ġ 8 ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . to _ string ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 0 / 8 " ĊĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThe Ġ+ prefix + Ġparameter Ġis Ġoptional : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address :: IPv 4 :: parse _ u 3 2 ( 1 6 7 7 7 2 1 6 0 , Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . to _ string ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 0 / 8 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġparse _ u 3 2 ( ip 3 2 : Ġu 3 2 , Ġprefix : Ġu 8 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠIPv 4 :: new ( String . format ("{} /{} ", ĠIPv 4 :: to _ ipv 4 _ str ( ip 3 2 ), Ġprefix )) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠCreates Ġa Ġnew ĠIPv 4 Ġobject Ġfrom Ġbinary Ġdata , ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġlike Ġthe Ġone Ġyou Ġget Ġfrom Ġa Ġnetwork Ġstream . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠFor Ġexample , Ġon Ġa Ġnetwork Ġstream Ġthe ĠIP Ġ 1 7 2 . 1 6 . 0 . 1 ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġis Ġrepresented Ġwith Ġthe Ġbinary Ġ"\ 2 5 4 \ 0 2 0 \ n \ 0 0 1 ". ĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address :: IPv 4 :: parse _ data Ġ"\ 2 5 4 \ 0 2 0 \ n \ 0 0 1 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . prefix Ġ= Ġ 2 4 ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . to _ string ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 . 1 / 2 4 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġself . parse _ data ( str , Ġprefix = 3 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġself . new ( str . unpack (" C 4 "). join (".") +" /// Ġ{ prefix }") ĊĠĠĠĠĠĠĠ Ġ// Ġend ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExtract Ġan ĠIPv 4 Ġaddress Ġfrom Ġa Ġstring Ġand ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġreturns Ġa Ġnew Ġobject ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġstr Ġ= Ġ" foobar 1 7 2 . 1 6 . 1 0 . 1 bar baz " ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address :: IPv 4 :: extract Ġstr ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . to _ s ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 . 1 " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġself . extract ( str ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġlet Ġre Ġ= ĠRegex p :: new ( r " (( 2 5 [ 0 - 5 ]| 2 [ 0 - 4 ]\ d | 1 \ d \ d |[ 1 - 9 ]\ d |\ d )\ . ){ 3 }( 2 5 [ 0 - 5 ]| 2 [ 0 - 4 ]\ d | 1 ĊĠĠĠĠĠĠĠ Ġ// Ġ\ d \ d |[ 1 - 9 ]\ d |\ d )") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠIPv 4 :: new (. match ( str ). to _ s ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠSum mar ization Ġ( or Ġaggregation ) Ġis Ġthe Ġprocess Ġwhen Ġtwo Ġor Ġmore ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġnetworks Ġare Ġtaken Ġtogether Ġto Ġcheck Ġif Ġa Ġsuper net , Ġincluding Ġall ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġand Ġonly Ġthese Ġnetworks , Ġexists . ĠIf Ġit Ġexists Ġthen Ġthis Ġsuper net ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġis Ġcalled Ġthe Ġsummar ized Ġ( or Ġaggregated ) Ġnetwork . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIt Ġis Ġvery Ġimportant Ġto Ġunderstand Ġthat Ġsummar ization Ġcan Ġonly ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġoccur Ġif Ġthere Ġare Ġno Ġholes Ġin Ġthe Ġaggregated Ġnetwork , Ġor , Ġin Ġother ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwords , Ġif Ġthe Ġgiven Ġnetworks Ġfill Ġcompletely Ġthe Ġaddress Ġspace ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġof Ġthe Ġsuper net . ĠSo Ġthe Ġtwo Ġrules Ġare : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ 1 ) ĠThe Ġaggregate Ġnetwork Ġmust Ġcontain Ġ+ all + Ġthe ĠIP Ġaddresses Ġof Ġthe ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġoriginal Ġnetworks ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠ 2 ) ĠThe Ġaggregate Ġnetwork Ġmust Ġcontain Ġ+ only + Ġthe ĠIP Ġaddresses Ġof Ġthe ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġoriginal Ġnetworks ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠA Ġfew Ġexamples Ġwill Ġhelp Ġclarify Ġthe Ġabove . ĠLet 's Ġconsider Ġfor ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġinstance Ġthe Ġfollowing Ġtwo Ġnetworks : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 1 Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 0 . 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 2 Ġ= ĠIP Address (" 1 7 2 . 1 6 . 1 1 . 0 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThese Ġtwo Ġnetworks Ġcan Ġbe Ġexpressed Ġusing Ġonly Ġone ĠIP Ġaddress ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġnetwork Ġif Ġwe Ġchange Ġthe Ġprefix . ĠLet ĠRuby Ġdo Ġthe Ġwork : ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ ĠIP Address :: IPv 4 :: sum mar ize ( ip 1 , ip 2 ). to _ s ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 7 2 . 1 6 . 1 0 . 0 / 2 3 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠWe Ġnote Ġhow Ġthe Ġnetwork Ġ" 1 7 2 . 1 6 . 1 0 . 0 / 2 3 " Ġincludes Ġall Ġthe Ġaddresses ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġspecified Ġin Ġthe Ġabove Ġnetworks , Ġand Ġ( more Ġimportant ) Ġincludes ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠONLY Ġthose Ġaddresses . ĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIf Ġwe Ġsummar ized Ġ+ ip 1 + Ġand Ġ+ ip 2 + Ġwith Ġthe Ġfollowing Ġnetwork : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ" 1 7 2 . 1 6 . 0 . 0 / 1 6 " ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġwe Ġwould Ġhave Ġsatisfied Ġrule Ġ// Ġ 1 Ġabove , Ġbut Ġnot Ġrule Ġ// Ġ 2 . ĠSo Ġ" 1 7 2 . 1 6 . 0 . 0 / 1 6 " ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġis Ġnot Ġan Ġaggregate Ġnetwork Ġfor Ġ+ ip 1 + Ġand Ġ+ ip 2 +. ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIf Ġit 's Ġnot Ġpossible Ġto Ġcompute Ġa Ġsingle Ġaggregated Ġnetwork Ġfor Ġall Ġthe ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġoriginal Ġnetworks , Ġthe Ġmethod Ġreturns Ġan Ġarray Ġwith Ġall Ġthe Ġaggregate ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġnetworks Ġfound . ĠFor Ġexample , Ġthe Ġfollowing Ġfour Ġnetworks Ġcan Ġbe ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġaggregated Ġin Ġa Ġsingle Ġ/ 2 2 : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 1 Ġ= ĠIP Address (" 1 0 . 0 . 0 . 1 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 2 Ġ= ĠIP Address (" 1 0 . 0 . 1 . 1 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 3 Ġ= ĠIP Address (" 1 0 . 0 . 2 . 1 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 4 Ġ= ĠIP Address (" 1 0 . 0 . 3 . 1 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ ĠIP Address :: IPv 4 :: sum mar ize ( ip 1 , ip 2 , ip 3 , ip 4 ). to _ string ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 1 0 . 0 . 0 . 0 / 2 2 ", ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠBut Ġthe Ġfollowing Ġnetworks Ġcan 't Ġbe Ġsummar ized Ġin Ġa Ġsingle Ġnetwork : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 1 Ġ= ĠIP Address (" 1 0 . 0 . 1 . 1 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 2 Ġ= ĠIP Address (" 1 0 . 0 . 2 . 1 / 2 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 3 Ġ= ĠIP Address (" 1 0 . 0 . 3 . 1 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip 4 Ġ= ĠIP Address (" 1 0 . 0 . 4 . 1 / 2 4 ") ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ ĠIP Address :: IPv 4 :: sum mar ize ( ip 1 , ip 2 , ip 3 , ip 4 ). map {| i | Ġi . to _ string } ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ[" 1 0 . 0 . 1 . 0 / 2 4 "," 1 0 . 0 . 2 . 0 / 2 3 "," 1 0 . 0 . 4 . 0 / 2 4 "] ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġpub Ġfn Ġself . sum mar ize ( args ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠIP Address . sum mar ize ( args ) ĊĠĠĠĠĠĠĠ Ġ// Ġend ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠCreates Ġa Ġnew ĠIPv 4 Ġaddress Ġobject Ġby Ġparsing Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġaddress Ġin Ġa Ġclass ful Ġway . ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠClass ful Ġaddresses Ġhave Ġa Ġfixed Ġnet mask Ġbased Ġon Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġclass Ġthey Ġbelong Ġto : ĊĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ* ĠClass ĠA , Ġfrom Ġ 0 . 0 . 0 . 0 Ġto Ġ 1 2 7 . 2 5 5 . 2 5 5 . 2 5 5 ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ* ĠClass ĠB , Ġfrom Ġ 1 2 8 . 0 . 0 . 0 Ġto Ġ 1 9 1 . 2 5 5 . 2 5 5 . 2 5 5 ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ* ĠClass ĠC , ĠD Ġand ĠE , Ġfrom Ġ 1 9 2 . 0 . 0 . 0 Ġto Ġ 2 5 5 . 2 5 5 . 2 5 5 . 2 5 4 ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠExample : ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip Ġ= ĠIP Address :: IPv 4 . parse _ class ful Ġ" 1 0 . 0 . 0 . 1 " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . net mask ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġ" 2 5 5 . 0 . 0 . 0 " ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġip . a ? ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ// Ġ=> Ġtrue ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠNote Ġthat Ġclasses ĠC , ĠD Ġand ĠE Ġwill Ġall Ġhave Ġa Ġdefault ĊĊĠĠĠĠĠĠĠ Ġ// Ġ Ġprefix Ġof Ġ/ 2 4 Ġor Ġ 2 5 5 . 2 5 5 . 2 5 5 . 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġfun Ġparse _ class ful ( ip _ s : ĠString ): ĠResult < IPAddress > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! IPAddress . is _ valid _ ipv 4 ( ip _ s )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Err (" Invalid ĠIP Ġ${ ip _ s }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo _ ip Ġ= ĠIP Address . parse ( ip _ s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( o _ ip . is Err ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġo _ ip ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġo _ ip . unwrap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is _ class _ a ( ip )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIP Address . parse ( String . format ("% s / 8 ", Ġip . to _ s ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is _ class _ b ( ip )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIP Address . parse ( String . format ("% s / 1 6 ", Ġip . to _ s ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is _ class _ c ( ip )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIP Address . parse ( String . format ("% s / 2 4 ", Ġip . to _ s ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Ok ( ip ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ