IPv6 API Programming
IPv6 API Programming
Rino Nucara GARR rino.nucara@garr.it EuChinaGRID IPv6 Tutorial Catania, June 6th, 2007
IPv6 Tutorial
Content
TheimportanceofbeinganIPv6programmer IPv4/IPv6Interoperability IntroductiontoIPv6Programmingfor
C
APIs PortingapplicationsinIPv6
Bibliography
IPv6 Tutorial
GeneralizedlackIPv6compatibleapplicationsinorderto boostthemigration.
ItisimportantforprogrammerstothinkIPv6:
IPv6 Tutorial
IPv4/IPv6 Interoperability
Forsome(..2,5,200..:))yearswewillliveina dualIPprotocolversionworld. WewillseeprogressivespreadofIPv6deployment andaveryrelevantresidualusageofIPv4alloverthe world Waysforinteroperatingbetweentwoincompatible protocolsneedtobeidentified
IPv6 Tutorial
IPv6 Tutorial
DualStack
SingleIPv4orIPv6stacks
Rino Nucara - GARR
IPv6 Tutorial
DualStack
SingleIPv4orIPv6stacks
Rino Nucara - GARR
IPv6 Tutorial
DualStack
SingleIPv4orIPv6stacks
Rino Nucara - GARR
IPv6 Tutorial
DualStack
SingleIPv4orIPv6stacks
Rino Nucara - GARR
IPv6 Tutorial
DualStackorseparatedstack
SingleIPv4orIPv6stacks
10
IPv6 Tutorial
Summary
IPv4server IPv4/I IPv4 Pv6 IPv4 IPv4 IPv4 X IPv4 IPv4 X IPv4
IPv4 IPv4 client IPv4/I Pv6 IPv6 IPv6 client IPv4/I Pv6
IPv6server IPv4/I IPv6 Pv6 X IPv4 X IPv6 IPv6 IPv4 IPv6 IPv6
11
IPv6 Tutorial
12
IPv6 Tutorial
IPv6s API
IETFstandardizedtwosetsofextensions:RFC3493andRFC3542. RFC3493BasicSocketInterfaceExtensionsforIPv6
Isthelatestspecification(thesuccessortoRFC2133andRFC2553) Itisoftenreferredtoas2553bis ProvidesstandarddefinitionsforCoresocketfunctions,Addressdata structures, NametoAddress translation functions, Address conversionfunctions
IsthelatestspecificationandisthesuccessortoRFC2292. Itisoftenreferredtoas2292bis DefinesinterfacesforaccessingspecialIPv6packetinformationsuch astheIPv6headerandtheextensionheaders. Advanced APIs are also used to extend the capability of IPv6 raw socket
Rino Nucara - GARR
13
IPv6 Tutorial
#include<net/if.h> unsignedintif_nametoindex(constchar*ifname); #include<net/if.h> char*if_indextoname(unsignedintifindex,char*ifname); structif_nameindex{ unsignedintif_index;/*1,2,...*/ char*if_name;/*nullterminatedname:"le0",...*/ }; #include<net/if.h> structif_nameindex*if_nameindex(void); #include<net/if.h> voidif_freenameindex(structif_nameindex*ptr);
14
IPv6 Tutorial
if_freenameindex(ifs);
}
15
IPv6 Tutorial
Anewaddressfamilyname,AF_INET6wasdefinedforIPv6;therelated protocolfamilyisPF_INET6,andnamesbelongingtoitaredefinedasfollow:
IPv4sourcecode:
socket(PF_INET,SOCK_STREAM,0);/*TCPsocket*/ socket(PF_INET,SOCK_DGRAM,0);/*UDPsocket*/
IPv6sourcecode:
socket(PF_INET6,SOCK_STREAM,0);/*TCPsocket*/ socket(PF_INET6,SOCK_DGRAM,0);/*UDPsocket*/
16
IPv6 Tutorial
Address structures
IPv4 IPv6
structsockaddr_in
structsockaddr_in6
IPv4/IPv6/
structsockaddr_storage
17
IPv6 Tutorial
FunctionsprovidedbysocketAPIusesocketaddressstructurestodetermine thecommunicationserviceaccesspoint. Sincedifferentprotocolscanhandlesocketfunctions,agenericsocket addressstructurecalledsockaddrisusedasargumenttothesefunctions Fromanapplicationprogrammerspointofview,theonlyuseofthese genericsocketaddressstructuresistocastpointerstoprotocolspecific structures. sockaddrstructure(2+14bytes)holdssocketaddressinformationformany typesofsockets. sa_familyrepresentsaddressfamily. sa_datacontainsdataaboutaddress.
18
IPv6 Tutorial
19
IPv6 Tutorial
sin_zeroisincludedtopadthestructuretothelengthofastructsockaddr andshouldbesettoallzerousingthebzero()ormemset()functions.
20
IPv6 Tutorial
Casting
structsockaddr_inaddrIPv4; /*fillinaddrIPv4{}*/ Bind(sockfd,(structsockaddr*)&addrIPv4,sizeof(addrIPv4));
21
IPv6 Tutorial
22
IPv6 Tutorial
23
IPv6 Tutorial
24
IPv6 Tutorial
ether0 fe80::1
ether1 fe80::1
25
IPv6 Tutorial
26
IPv6 Tutorial
27
IPv6 Tutorial
28
IPv6 Tutorial
29
IPv6 Tutorial
IPv4: IPv6:
IPv4andIPv6:
30
IPv6 Tutorial
IPv4andIPv6:
31
IPv6 Tutorial
#include<netinet/in.h>: externconststructin6_addrin6addr_any;
Forexample,tobindasockettoportnumber23,butletthesystemselectthe sourceaddress,anapplicationcouldusethefollowingcode:
structsockaddr_in6sin6; ... sin6.sin6_family=AF_INET6; sin6.sin6_flowinfo=0; sin6.sin6_port=htons(23); sin6.sin6_addr=in6addr_any;/*structureassignment*/ ... if(bind(s,(structsockaddr*)&sin6,sizeof(sin6))==1) a ...
32
IPv6 Tutorial
Thisconstantcanbeusedtoinitializeanin6_addrstructure:
structin6_addranyaddr=IN6ADDR_ANY_INIT;
33
IPv6 Tutorial
<netinet/in.h> externconststructin6_addrin6addr_loopback;
34
IPv6 Tutorial
SecondwayisasymbolicconstantnamedIN6ADDR_LOOPBACK_INIT:
<netinet/in.h> #defineIN6ADDR_LOOPBACK_INIT{{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}}
ItcanbeusedatdeclarationtimeONLY. forexample:
structin6_addrloopbackaddr=IN6ADDR_LOOPBACK_INIT;
LikeIN6ADDR_ANY_INIT,thisconstantcannotbeusedinanassignment toapreviouslydeclaredIPv6addressvariable.
35
IPv6 Tutorial
Socket Options
AnumberofnewsocketoptionsaredefinedforIPv6:
IPV6_UNICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_HOPS IPV6_MULTICAST_LOOP IPV6_JOIN_GROUP IPV6_LEAVE_GROUP
IPV6_V6ONLY
AllofthesenewoptionsareattheIPPROTO_IPV6level(specifiesthecode inthesystemtointerprettheoption). ThedeclarationforIPPROTO_IPV6isobtainedbyincludingtheheader <netinet/in.h>.
36
IPv6 Tutorial
IPV6_UNICAST_HOPSoptioncontrolsthehoplimitusedinoutgoingunicast IPv6packets.
37
IPv6 Tutorial
IPV6_V6ONLY
AF_INET6socketsmaybeusedforbothIPv4andIPv6comunications. thesocketcanbeusedtosendandreceiveIPv6packetsonly. takesanintvalue(butisabooleanoption). bydefaultisturnedoff.
inton=1; if(setsockopt(s,IPPROTO_IPV6,IPV6_V6ONLY,(char*)&on,sizeof(on))==1) perror("setsockoptIPV6_V6ONLY"); else printf("IPV6_V6ONLYset\n");
38
IPv6 Tutorial
IPV6_V6ONLY EXAMPLE
structsockaddr_in6sin6,sin6_accept; socklen_tsin6_len;ints0,s;inton;charhbuf[NI_MAXHOST]; memset(&sin6,0,sizeof(sin6)); sin6.sin6_family=AF_INET6;sin6.sin6_len=sizeof(sin6); sin6.sin6_port=htons(5001); s0=socket(AF_INET6,SOCK_STREAM,IPPROTO_TCP); on=1;setsockopt=(s0,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); #ifdefUSE_IPV6_V6ONLY on=1; setsockopt(s0,IPPROTO_IPV6,IPV6_V6ONLY,&on,sizeof(on)); #endif bind(s0,(conststructsockaddr*)&sin6,sizeof(sin6)); listen(s0,1); while(1){ sin6_len=sizeof(sin6_accept); s=accept(s0,(structsockaddr*)&sin6_accept,&sin6_len); getnameinfo((structsockaddr*)&sin6_accept,sin6_len,hbuf, sizeof(hbuf),NULL,0,NI_NUMERICHOST); printf("acceptaconnectionfrom%s\n",hbuf); close(s); }
39
IPv6 Tutorial
WithUSE_IPV6_V6ONLY
telnet::15001 telnet127.0.0.15001 Acceptaconnectionfrom::1
Trying127.0.0.1 telnet:connectiontoaddress127.0.0.1:Connectionrefused
40
IPv6 Tutorial
Followingthereareimplementationexamplesaboutdualstackandseparated stackinC
41
IPv6 Tutorial
42
IPv6 Tutorial
43
IPv6 Tutorial
src 2001:db8::1234
inet_pton() inet_ntop()
44
IPv6 Tutorial
45
46
IPv6 Tutorial
47
IPv6 Tutorial
48
IPv6 Tutorial
DEPRECATED
DEPRECATED
49
IPv6 Tutorial
getaddrinfo
Rino Nucara - GARR
Addrinfo (desidereddata)
50
IPv6 Tutorial
51
IPv6 Tutorial
52
IPv6 Tutorial
ai_flagsshallbesettozeroorbethebitwiseinclusiveORofoneormoreof thevalues: AI_PASSIVE ifitisspecifiedthecallerrequiresaddressesthataresuitableforaccepting incomingconnections.Whenthisflagisspecified,nodenameisusuallyNULL, andaddressfieldoftheai_addrmemberisfilledwiththe"anyaddress(e.g. INADDR_ANYforanIPv4orIN6ADDR_ANY_INITforanIPv6). AI_CANONNAME thefunctionshallattempttodeterminethecanonicalnamecorrespondingto nodename(Thefirstelementofthereturnedlisthastheai_canonnamefilled inwiththeofficialnameofthemachine).
53
IPv6 Tutorial
AI_NUMERICHOST specifiesthatnodenameisanumerichostaddressstring.Otherwise,an [EAI_NONAME]errorisreturned.Thisflagshallpreventanytypeofname resolutionservice(forexample,theDNS)frombeinginvoked. AI_NUMERICSERV specifiesthatservnameisanumericportstring.Otherwise,an [EAI_NONAME]errorshallbereturned.Thisflagshallpreventanytypeof nameresolutionservice(forexample,NIS+)frombeinginvoked. AI_V4MAPPED ifnoIPv6addressesarematched,IPv4mappedIPv6addressesforIPv4 addressesthatmatchnodenameshallbereturned.Thisflagisapplicableonly whenai_familyisAF_INET6inthehintsstructure.
54
IPv6 Tutorial
AI_ALL IfthisflagissetalongwithAI_V4MAPPEDwhenlookingupIPv6addresses thefunctionwillreturnallIPv6addressesaswellasallIPv4addresses.The lattermappedtoIPv6format. AI_ADDRCONFIG onlyaddresseswhosefamilyissupportedbythesystemwillbereturned. AI_ADDRCONFIG IPv4addressesshallbereturnedonlyifanIPv4addressisconfiguredonthe localsystem,andIPv6addressesshallbereturnedonlyifanIPv6addressis configuredonthelocalsystem.Theloopbackaddressisnotconsideredfor thiscaseasvalidasaconfiguredaddress.
55
IPv6 Tutorial
getaddrinfo output
Ifgetaddrinforeturns0(success)resargumentisfilledinwithapointertoa linkedlistofaddrinfostructures(linkedthroughtheai_nextpointer.
56
IPv6 Tutorial
getaddrinfo output
structaddrinfo{ intai_flags;/*AI_PASSIVE,AI_CANONNAME,..*/ intai_family;/*AF_xxx*/ intai_socktype;/*SOCK_xxx*/ intai_protocol;/*0orIPPROTO_xxxforIPv4andIPv6*/ socklen_tai_addrlen;/*lengthofai_addr*/ char*ai_canonname;/*canonicalnamefornodename*/ structsockaddr*ai_addr;/*binaryaddress*/ structaddrinfo*ai_next;/*nextstructureinlinkedlist*/ };
57
IPv6 Tutorial
(error
char*gai_strerror(interror);
Thenonzeroerrorreturnvaluesfromgetaddrinfocanbetraslatedbythe gai_strerrorfunctionintoahumanreadablestring.
EAI_ADDRFAMILYThespecifiednetworkhostdoesnothaveany networkaddressesintherequestedaddress family. EAI_ADDRFAMILYaddressfamilyforhostnamenotsupported EAI_AGAINThenameserverreturnedatemporaryfailure indication.Tryagainlater. EAI_BADFLAGSai_flagscontainsinvalidflags. EAI_FAILunrecoverablefailureinnameresolution EAI_FAMILYTherequestedaddressfamilyisnotsupported atall. EAI_MEMORYOutofmemory. EAI_NODATAThespecifiednetworkhostexists,butdoesnot haveanynetworkaddressesdefined. EAI_NONAMEhostnameorservicenotprovidedorknown EAI_SERVICEservicenotsupportedforai_socktype EAI_SOCKTYPETherequestedsockettypeisnotsupportedat all. EAI_SYSTEMOthersystemerror,checkerrnofordetails.
58
IPv6 Tutorial
gai_strerror example
error=getaddrinfo("www.kame.net","http",&hints,&res0); if(error) { fprintf(stderr,"error:%s\n",gai_strerror(error)); exit(1); }
59
IPv6 Tutorial
60
IPv6 Tutorial
freeaddrinfo example
n=getaddrinfo(hostname,service,&hints,&res); //Tryopensocketwitheachaddressgetaddrinforeturned,until gettingavalidsocket. resave=res; while(res){ sockfd=socket(res>ai_family, res>ai_socktype, res>ai_protocol); if(!(sockfd<0)) break; res=res>ai_next; }
freeaddrinfo(ressave);
61
IPv6 Tutorial
getnameinfo (1/4)
getnameinfoisthecomplementaryfunctiontogetaddrinfo: ittakesasocketaddressandreturnsacharacterstringdescribingthe hostandanothercharacterstringdescribingtheservice.
#include<sys/socket.h> #include<netdb.h> intgetnameinfo(conststructsockaddr*sa,socklen_tsalen, char*host,socklen_thostlen, char*service,socklen_tservicelen, intflags);
sockaddr, Options(flags)
getnameinfo
hostandservice
62
IPv6 Tutorial
63
IPv6 Tutorial
input and
Tohelpallocatearraystoholdstringpointedbyhostandservice,two constantsaredefined:NI_MAXHOSTandNIMAXSERV.
#include<netdb.h> NI_MAXHOST//=1025maximumsizeofreturnedhoststring NIMAXSERV//=32maximumsizeofreturnedservicestring
64
IPv6 Tutorial
getnameinfo (4/4)
#include<sys/socket.h> #include<netdb.h> intgetnameinfo(conststructsockaddr*sa,socklen_tsalen, char*host,socklen_thostlen, char*service,socklen_tservicelen, intflags);
65
IPv6 Tutorial
getnameinfo (4/4)
#include<sys/socket.h> #include<netdb.h> intgetnameinfo(conststructsockaddr*sa,socklen_tsalen, char*host,socklen_thostlen, char*service,socklen_tservicelen, intflags);
66
IPv6 Tutorial
getnameinfo examples
Twoexampleswillnowfollow,illustratingtheusage ofgetaddrinfo():
Firstillustratestheusageoftheresultfromgetaddrinfo() forsubsequentcallstosocket()andtoconnect(). Secondpassivelyopenslisteningsocketstoaccept incomingHTTP.
67
IPv6 Tutorial
fo examples 1 structaddrinfohints,*res,*res0;interror;ints;
memset(&hints,0,sizeof(hints)); hints.ai_family=AF_UNSPEC; hints.ai_socktype=SOCK_STREAM; error=getaddrinfo("www.kame.net","http",&hints,&res0); [] s=1; for(res=res0;res;res=res>ai_next) { s=socket(res>ai_family,res>ai_socktype,res>ai_protocol); if(s<0)continue; if(connect(s,res>ai_addr,res>ai_addrlen)<0){ close(s);s=1;continue;} break;//wegotone! } if(s<0){fprintf(stderr,"Noaddressesarereachable");exit(1);} freeaddrinfo(res0); }
68
IPv6 Tutorial
69
IPv6 Tutorial
70
IPv6 Tutorial
71
IPv6 Tutorial
72
IPv6 Tutorial
Rewriting applications
TorewriteanapplicationwithIPv6compliantcode, thefirststepistofindallIPv4dependentfunctions. Asimplewayistocheckthesourceandheaderfile withUNIXgreputility.
$grepsockaddr_in*c*.h $grepin_addr*.c*.h $grepinet_aton*.c*.h $grepgethostbyname*.c*.h
73
IPv6 Tutorial
Rewriting applications
Developersshouldpayattentiontohardcoded numericaladdress,hostnames,andbinary representationofaddresses. Itisrecommendedtomadeallnetworkfunctionsina singlefile. Itisalsosuggestedtoreplaceallgethostbyname withthegetaddrinfofunction,asimpleswitchcanbe usedtoimplementprotocoldependentpartofthe code. Serverapplicationsmustbedevelopedtohandle multiplelistensockets,oneperaddressfamily,using theselectcall.
74
IPv6 Tutorial
75
IPv6 Tutorial
76
IPv6 Tutorial
77
IPv6 Tutorial
importjava.io.*;importjava.net.*; ServerSocketserverSock=null;Socketcs=null; try{ serverSock=newServerSocket(5000); cs=serverSock.accept(); BufferedOutputStreamb=new BufferedOutputStream(cs.getOutputStream()); PrintStreamos=newPrintStream(b,false); os.println(hallo!);os.println("Stop"); cs.close(); os.close(); }catch(Exceptione){[...]}
78
IPv6 Tutorial
79
IPv6 Tutorial
InetAddress
ThisclassrepresentsanIPaddress.Itprovides addressstorage,nameaddresstranslationmethods, addressconversionmethods,aswellasaddress testingmethods. InJ2SE1.4,thisclassisextendedtosupportboth IPv4andIPv6addresses. Utilitymethodsareaddedtocheckaddresstypesand scopes.
80
IPv6 Tutorial
InetAddress Example
InetAddressia=InetAddress.getByName("www.garr.it"); //or InetAddressia=InetAddress.getByName([::1]");//or "::1" Stringhost_name=ia.getHostName(); System.out.println(host_name);//ip6localhost Stringaddr=ia.getHostAddress(); System.out.println(addr);//printIPADDRESS InetAddress[]alladr=ia.getAllByName("www.kame.net"); for(inti=0;i<alladr.length;i++){System.out.println(alladr[i]);} print: www.kame.net/203.178.141.194 www.kame.net/2001:200:0:8002:203:47ff:fea5:3085
81
IPv6 Tutorial
82
IPv6 Tutorial
InetAddress
Inet4Address
Inet6Address
83
IPv6 Tutorial
New metods
InInetAddressclassnewmetodshavebeenadded: InetAddress.isAnyLocalAddress() InetAddress.isLoopbackAddress() InetAddress.isLinkLocalAddress() InetAddress.isSiteLocalAddress() InetAddress.isMCGlobal() InetAddress.isMCNodeLocal() InetAddress.isMCLinkLocal() InetAddress.isMCSiteLocal() InetAddress.isMCOrgLocal() InetAddress.getCanonicalHostName() InetAddress.getByAddr() Inet6AddresshaveametodmorethanInet4Address: Inet6Address.isIPv4CompatibleAddress()
84
IPv6 Tutorial
Code Example
EnumerationnetInter=NetworkInterface.getNetworkInterfaces(); while(netInter.hasMoreElements()) { NetworkInterfaceni=(NetworkInterface)netInter.nextElement(); System.out.println("Net.Int.:"+ni.getDisplayName()); Enumerationaddrs=ni.getInetAddresses(); while(addrs.hasMoreElements()) { Objecto=addrs.nextElement(); if(o.getClass()==InetAddress.class|| o.getClass()==Inet4Address.class|| o.getClass()==Inet6Address.class) { InetAddressiaddr=(InetAddress)o; System.out.println(iaddr.getCanonicalHostName()); System.out.print("addrtype:"); if(o.getClass()==Inet4Address.class){println("IPv4");} if(o.getClass()==Inet6Address.class){println("IPv6");} System.out.println("IP:"+iaddr.getHostAddress()); System.out.println("Loopback?"+iaddr.isLoopbackAddress()); System.out.println("SiteLocal?"+iaddr.isSiteLocalAddress()); System.out.println("LinkLocal?"+iaddr.isLinkLocalAddress()); } } Rino Nucara - GARR IPv6 Tutorial 85 }
Output Example
Net.Int.:eth0 CanonicalHostName:fe80:0:0:0:212:79ff:fe67:683d%2 addrtype:IPv6IP:fe80:0:0:0:212:79ff:fe67:683d%2 Loopback?FalseSiteLocal?FalseLinkLocal?true CanonicalHostName:2001:760:40ec:0:212:79ff:fe67:683d%2 addrtype:IPv6IP:2001:760:40ec:0:212:79ff:fe67:683d%2 Loopback?FalseSiteLocal?FalseLinkLocal?false CanonicalHostName:pcgarr20.dir.garr.it addrtype:IPv4IP:193.206.158.140 Loopback?FalseSiteLocal?FalseLinkLocal?false Net.Int.:lo CanonicalHostName:ip6localhost addrtype:IPv6IP:0:0:0:0:0:0:0:1%1 Loopback?TrueSiteLocal?FalseLinkLocal?false CanonicalHostName:localhost addrtype:IPv4IP:127.0.0.1 Loopback?TrueSiteLocal?FalseLinkLocal?false
86
IPv6 Tutorial
87
IPv6 Tutorial
88
IPv6 Tutorial
89
IPv6 Tutorial
System.setProperty("java.net.preferIPv4Stack","true");
Doesnot Work!
Doesnot Work!
90
IPv6 Tutorial
91
IPv6 Tutorial
java.net.preferIPv6Addresses Example
92
IPv6 Tutorial
94
IPv6 Tutorial
useSocket UseSocket6
95
IPv6 Tutorial
Function list
inet_pton(FAMILY,TEXT_ADDRESS)
ThisfunctionconvertsstringformatIPv4/IPv6addressestobinaryformat,the FAMILYargumentspecifythetypeofaddress(AF_INETorAF_INET6).
inet_ntop(FAMILY,BINARY_ADDRESS)
example
$a=inet_ntop(AF_INET6,inet_pton(AF_INET6,"::1")); print$a;//print::1 96
Rino Nucara - GARR IPv6 Tutorial
Function list
pack_sockaddr_in6(PORT,ADDRESS)
example
$lh6=inet_pton(AF_INET6,"::1"); $p_saddr6=pack_sockaddr_in6(80,$lh6); ($port,$host)=unpack_sockaddr_in6($p_saddr6); printinet_ntop(AF_INET6,$host);//print::1 print$port;//print80 97
Rino Nucara - GARR IPv6 Tutorial
Function list
pack_sockaddr_in6_all(PORT,FLOWINFO,ADDRESS,SCOPEID)
Thisfunctionreturnsasockaddr_in6structurefilledwiththefourspecified arguments.
unpack_sockaddr_in6_all(NAME)
98
IPv6 Tutorial
Function list
)]getaddrinfo(NODENAME,SERVICENAME,[FAMILY,SOCKTYPE,PROTOCOL,FLAGS
Thisfunctionreturnsanodeoraservicename.TheoptionalattributeFLAG controlswhatkindoflookupisperformed.
99
IPv6 Tutorial
Example
useSocket; useSocket6; @res=getaddrinfo('hishost.com','daytime',AF_UNSPEC,SOCK_STREAM); $family=1; while(scalar(@res)>=5){ ($family,$socktype,$proto,$saddr,$canonname,@res)=@res; ($host,$port)=getnameinfo($saddr,NI_NUMERICHOST|NI_NUMERICSERV); printSTDERR"Tryingtoconnectto$hostportport$port...\n"; socket(Socket_Handle,$family,$socktype,$proto)||next; connect(Socket_Handle,$saddr)&&last; close(Socket_Handle); $family=1; } if($family!=1){ printSTDERR"connectedto$hostportport$port\n"; }else{ die"connectattemptfailed\n"; }
100
IPv6 Tutorial
Function list
gethostbyname2(HOSTNAME,FAMILY)
Thisfunctionreturnsastringcorrespondingtotheerrornumberpassedinas anargument.
in6addr_any
Thisfunctionreturnsthe16octetwildcardaddress.
in6add_loopback
Thisfunctionreturnsthe16octetloopbackaddress.
101
IPv6 Tutorial
Function list
getipnodebyname(HOST,[FAMILY,FLAGS])
102
IPv6 Tutorial
103
IPv6 Tutorial
104
IPv6 Tutorial
inet_ntop
stringinet_ntop(string$in_addr)
105
IPv6 Tutorial
inet_pton
stringinet_pton(string$address)
$in_addr=inet_pton('127.0.0.1'); $in6_addr=inet_pton('::1');
106
IPv6 Tutorial
fsockopen
resourcefsockopen(string$target[,int$port[,int&$errno[, string&$errstr[,float$timeout]]]])
107
IPv6 Tutorial
example code
$fp=fsockopen($ip,80,$errno,$errstr); if(!$fp){ echo"ERROR:$errno$errstr<br/>\n"; }else{ $status=socket_get_status($fp); var_dump($status); fwrite($fp,"GET\n"); $txt=fread($fp,1000); echo$txt; fclose($fp); }
kamenoanimesmall.gif
//www.kame.net $ip="203.178.141.194;
//www.kame.net $ip='[2001:200::8002:203:47ff:fea5:3085]';
kameanimesmall.gif
108
IPv6 Tutorial
checkdnsrr
intcheckdnsrr(string$host[,string$type])
Note:AAAAtypeaddedwithPHP5.0.0
Note:ThisfunctionisnotimplementedonWindowsplatforms. (usePEAR>>Net_DNS)
echocheckdnsrr('www.kame.net','AAAA');//return1.
109
IPv6 Tutorial
gethostbyname
stringgethostbyname(string$hostname)
110
IPv6 Tutorial
PearNet_IPv6Providesfunctiontoworkwiththe'InternetProtocolv6. Net_IPv6::checkIPv6()ValidationofIPv6addresses Net_IPv6::compress()compressanIPv6address Net_IPv6::uncompress()UncompressesanIPv6address Net_IPv6::getAddressType()ReturnsthetypeofanIPaddress Net_IPv6::getNetmask()Calculatesthenetworkprefix Net_IPv6::isInNetmask()ChecksifanIPisinaspecificaddressspace Net_IPv6::removeNetmaskSpec()RemovestheNetmasklength specification Net_IPv6::splitV64()splitsanIPv6addressinitIPv6andIPv4part
booleanNet_IPv6::checkIPv6(string$ip)
ChecksanIPforIPv6compatibility.$ipisthiptocheck.
111
IPv6 Tutorial
112
IPv6 Tutorial
ReturnsthetypeofanIPaddress.RFC1883,Section2.3describesseveral typesofaddressesintheIPv6addressespace.Thismethodstriestofindthe typeofaddressforthegivenIP. Returntheaddresstype(int).thetypecanbeoneofthisconstants: NET_IPV6_MULTICAST NET_IPV6_UNICAST_PROVIDER NET_IPV6_LOCAL_LINK NET_IPV6_LOCAL_SITE NET_IPV6_UNKNOWN_TYPE NET_IPV6_RESERVED_UNICAST_GEOGRAPHIC NET_IPV6_RESERVED_IPX NET_IPV6_RESERVED NET_IPV6_RESERVED_NSAP NET_IPV6_UNASSIGNED
113
Rino Nucara - GARR IPv6 Tutorial
114
IPv6 Tutorial
Checksifan(compressed)IPisinaspecificaddressspace.IftheIPdoesnot containthenumberofnetmaskbits(forexample:F8000::FFFF/16),thenyou havetousethe$bitsparameter. string$iptheIPaddressinHexformat,compressedIPsareallowed string$netmaskthenetmask(forexample:F800::) int$bitsifthenumberofnetmaskbitsisnotpartoftheIP,youmust providethemumberofbits Returnvalue booleanTRUE,iftheIPisintheaddressspace. Thisfunctioncanbecalledstatically.
115
IPv6 Tutorial
Checksifan(compressed)IPisinaspecificaddressspace.IftheIPdoesnot containthenumberofnetmaskbits(forexample:F8000::FFFF/16),thenyou havetousethe$bitsparameter. string$iptheIPaddressinHexformat,compressedIPsareallowed string$netmaskthenetmask(forexample:F800::) int$bitsifthenumberofnetmaskbitsisnotpartoftheIP,youmust providethemumberofbits Returnvalue booleanTRUE,iftheIPisintheaddressspace. Thisfunctioncanbecalledstatically.
116
IPv6 Tutorial
117
IPv6 Tutorial
118
IPv6 Tutorial
Bibliography
119
IPv6 Tutorial
http://long.ccaba.upc.es/long/045Guidelines/LONG_Trans_app_IPv6.pdf
SimonePiccardi,GuidaallaProgrammazioneinLinux
http://72.34.43.90/IPV6/North_American_IPv6_Summit_2004/Wednesday/PDFs/ Jean_Christophe_Collet.pdf
120
IPv6 Tutorial
Bibliography (Books)
QingLiTatuyaJinmeiKeiichiShima IPv6CoreProtocolsImplementation MORGANKAUFMAN W.RichardStevens UnixNetworkProgramming(secondedition) PrenticeHall JunichiroitojunHagino IPv6NetworkProgramming ELSEVIERDIGITALPRESS ElliotteRustyHarold JavaNetworkProgramming OREILLY MerlinHughesMichaelShoffnerDerekHammer JavaNetworkProgramming2edition MANNING
121
IPv6 Tutorial