16617cf57SGeorge V. Neville-Neil.\" $KAME: getaddrinfo.3,v 1.36 2005/01/05 03:23:05 itojun Exp $ 26617cf57SGeorge V. Neville-Neil.\" $OpenBSD: getaddrinfo.3,v 1.35 2004/12/21 03:40:31 jaredy Exp $ 36617cf57SGeorge V. Neville-Neil.\" 46617cf57SGeorge V. Neville-Neil.\" Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") 56617cf57SGeorge V. Neville-Neil.\" Copyright (C) 2000, 2001 Internet Software Consortium. 66617cf57SGeorge V. Neville-Neil.\" 76617cf57SGeorge V. Neville-Neil.\" Permission to use, copy, modify, and distribute this software for any 86617cf57SGeorge V. Neville-Neil.\" purpose with or without fee is hereby granted, provided that the above 96617cf57SGeorge V. Neville-Neil.\" copyright notice and this permission notice appear in all copies. 106617cf57SGeorge V. Neville-Neil.\" 116617cf57SGeorge V. Neville-Neil.\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 126617cf57SGeorge V. Neville-Neil.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 136617cf57SGeorge V. Neville-Neil.\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 146617cf57SGeorge V. Neville-Neil.\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 156617cf57SGeorge V. Neville-Neil.\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 166617cf57SGeorge V. Neville-Neil.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 176617cf57SGeorge V. Neville-Neil.\" PERFORMANCE OF THIS SOFTWARE. 186617cf57SGeorge V. Neville-Neil.\" 196b806d21SRuslan Ermilov.\" $FreeBSD$ 206b806d21SRuslan Ermilov.\" 21*bb957021SHiroki Sato.Dd September 20, 2015 226617cf57SGeorge V. Neville-Neil.Dt GETADDRINFO 3 236617cf57SGeorge V. Neville-Neil.Os 246617cf57SGeorge V. Neville-Neil.Sh NAME 256617cf57SGeorge V. Neville-Neil.Nm getaddrinfo , 266617cf57SGeorge V. Neville-Neil.Nm freeaddrinfo 276617cf57SGeorge V. Neville-Neil.Nd socket address structure to host and service name 286617cf57SGeorge V. Neville-Neil.Sh SYNOPSIS 29580dbd65SJoel Dahl.In sys/types.h 30580dbd65SJoel Dahl.In sys/socket.h 31580dbd65SJoel Dahl.In netdb.h 326617cf57SGeorge V. Neville-Neil.Ft int 33f789cb82SRuslan Ermilov.Fo getaddrinfo 34f789cb82SRuslan Ermilov.Fa "const char *hostname" "const char *servname" 35f789cb82SRuslan Ermilov.Fa "const struct addrinfo *hints" "struct addrinfo **res" 36f789cb82SRuslan Ermilov.Fc 376617cf57SGeorge V. Neville-Neil.Ft void 386617cf57SGeorge V. Neville-Neil.Fn freeaddrinfo "struct addrinfo *ai" 396617cf57SGeorge V. Neville-Neil.Sh DESCRIPTION 406617cf57SGeorge V. Neville-NeilThe 416617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 426617cf57SGeorge V. Neville-Neilfunction is used to get a list of 436617cf57SGeorge V. Neville-Neiladdresses and port numbers for host 446617cf57SGeorge V. Neville-Neil.Fa hostname 456617cf57SGeorge V. Neville-Neiland service 466617cf57SGeorge V. Neville-Neil.Fa servname . 476617cf57SGeorge V. Neville-NeilIt is a replacement for and provides more flexibility than the 486617cf57SGeorge V. Neville-Neil.Xr gethostbyname 3 496617cf57SGeorge V. Neville-Neiland 506617cf57SGeorge V. Neville-Neil.Xr getservbyname 3 516617cf57SGeorge V. Neville-Neilfunctions. 526617cf57SGeorge V. Neville-Neil.Pp 536617cf57SGeorge V. Neville-NeilThe 546617cf57SGeorge V. Neville-Neil.Fa hostname 556617cf57SGeorge V. Neville-Neiland 566617cf57SGeorge V. Neville-Neil.Fa servname 576617cf57SGeorge V. Neville-Neilarguments are either pointers to NUL-terminated strings or the null pointer. 586617cf57SGeorge V. Neville-NeilAn acceptable value for 596617cf57SGeorge V. Neville-Neil.Fa hostname 606617cf57SGeorge V. Neville-Neilis either a valid host name or a numeric host address string consisting 61*bb957021SHiroki Satoof a dotted decimal IPv4 address, 62*bb957021SHiroki Satoan IPv6 address, 63*bb957021SHiroki Satoor a UNIX-domain address. 646617cf57SGeorge V. Neville-NeilThe 656617cf57SGeorge V. Neville-Neil.Fa servname 666617cf57SGeorge V. Neville-Neilis either a decimal port number or a service name listed in 676617cf57SGeorge V. Neville-Neil.Xr services 5 . 686617cf57SGeorge V. Neville-NeilAt least one of 696617cf57SGeorge V. Neville-Neil.Fa hostname 706617cf57SGeorge V. Neville-Neiland 716617cf57SGeorge V. Neville-Neil.Fa servname 726617cf57SGeorge V. Neville-Neilmust be non-null. 736617cf57SGeorge V. Neville-Neil.Pp 746617cf57SGeorge V. Neville-Neil.Fa hints 756617cf57SGeorge V. Neville-Neilis an optional pointer to a 766617cf57SGeorge V. Neville-Neil.Li struct addrinfo , 776617cf57SGeorge V. Neville-Neilas defined by 786617cf57SGeorge V. Neville-Neil.Aq Pa netdb.h : 796617cf57SGeorge V. Neville-Neil.Bd -literal 806617cf57SGeorge V. Neville-Neilstruct addrinfo { 816617cf57SGeorge V. Neville-Neil int ai_flags; /* input flags */ 826617cf57SGeorge V. Neville-Neil int ai_family; /* protocol family for socket */ 836617cf57SGeorge V. Neville-Neil int ai_socktype; /* socket type */ 846617cf57SGeorge V. Neville-Neil int ai_protocol; /* protocol for socket */ 856617cf57SGeorge V. Neville-Neil socklen_t ai_addrlen; /* length of socket-address */ 866617cf57SGeorge V. Neville-Neil struct sockaddr *ai_addr; /* socket-address for socket */ 876617cf57SGeorge V. Neville-Neil char *ai_canonname; /* canonical name for service location */ 886617cf57SGeorge V. Neville-Neil struct addrinfo *ai_next; /* pointer to next in list */ 896617cf57SGeorge V. Neville-Neil}; 906617cf57SGeorge V. Neville-Neil.Ed 916617cf57SGeorge V. Neville-Neil.Pp 926617cf57SGeorge V. Neville-NeilThis structure can be used to provide hints concerning the type of socket 936617cf57SGeorge V. Neville-Neilthat the caller supports or wishes to use. 946617cf57SGeorge V. Neville-NeilThe caller can supply the following structure elements in 956617cf57SGeorge V. Neville-Neil.Fa hints : 966617cf57SGeorge V. Neville-Neil.Bl -tag -width "ai_socktypeXX" 976617cf57SGeorge V. Neville-Neil.It Fa ai_family 986617cf57SGeorge V. Neville-NeilThe protocol family that should be used. 996617cf57SGeorge V. Neville-NeilWhen 1006617cf57SGeorge V. Neville-Neil.Fa ai_family 1016617cf57SGeorge V. Neville-Neilis set to 1026617cf57SGeorge V. Neville-Neil.Dv PF_UNSPEC , 1036617cf57SGeorge V. Neville-Neilit means the caller will accept any protocol family supported by the 1046617cf57SGeorge V. Neville-Neiloperating system. 1056617cf57SGeorge V. Neville-Neil.It Fa ai_socktype 1066617cf57SGeorge V. Neville-NeilDenotes the type of socket that is wanted: 1076617cf57SGeorge V. Neville-Neil.Dv SOCK_STREAM , 1086617cf57SGeorge V. Neville-Neil.Dv SOCK_DGRAM , 109*bb957021SHiroki Sato.Dv SOCK_SEQPACKET , 1106617cf57SGeorge V. Neville-Neilor 1116617cf57SGeorge V. Neville-Neil.Dv SOCK_RAW . 1126617cf57SGeorge V. Neville-NeilWhen 1136617cf57SGeorge V. Neville-Neil.Fa ai_socktype 1146617cf57SGeorge V. Neville-Neilis zero the caller will accept any socket type. 1156617cf57SGeorge V. Neville-Neil.It Fa ai_protocol 1166617cf57SGeorge V. Neville-NeilIndicates which transport protocol is desired, 117*bb957021SHiroki Sato.Dv IPPROTO_UDP , 118*bb957021SHiroki Sato.Dv IPPROTO_TCP , 119*bb957021SHiroki Sato.Dv IPPROTO_SCTP , 1206617cf57SGeorge V. Neville-Neilor 121*bb957021SHiroki Sato.Dv IPPROTO_UDPLITE . 1226617cf57SGeorge V. Neville-NeilIf 1236617cf57SGeorge V. Neville-Neil.Fa ai_protocol 1246617cf57SGeorge V. Neville-Neilis zero the caller will accept any protocol. 1256617cf57SGeorge V. Neville-Neil.It Fa ai_flags 126eb1db428SRemko LodderThe 1276617cf57SGeorge V. Neville-Neil.Fa ai_flags 128eb1db428SRemko Lodderfield to which the 129eb1db428SRemko Lodder.Fa hints 130eb1db428SRemko Lodderparameter points shall be set to zero 131eb1db428SRemko Lodderor be the bitwise-inclusive OR of one or more of the values 132eb1db428SRemko Lodder.Dv AI_ADDRCONFIG , 133eb1db428SRemko Lodder.Dv AI_CANONNAME , 134eb1db428SRemko Lodder.Dv AI_NUMERICHOST , 1357cfc1e32SDaniel Gerzo.Dv AI_NUMERICSERV 136eb1db428SRemko Lodderand 1377cfc1e32SDaniel Gerzo.Dv AI_PASSIVE . 138*bb957021SHiroki SatoFor a UNIX-domain address, 139*bb957021SHiroki Sato.Fa ai_flags 140*bb957021SHiroki Satois ignored. 1416617cf57SGeorge V. Neville-Neil.Bl -tag -width "AI_CANONNAMEXX" 142eb1db428SRemko Lodder.It Dv AI_ADDRCONFIG 143eb1db428SRemko LodderIf the 144eb1db428SRemko Lodder.Dv AI_ADDRCONFIG 145eb1db428SRemko Lodderbit is set, IPv4 addresses shall be returned only if 146eb1db428SRemko Lodderan IPv4 address is configured on the local system, 147eb1db428SRemko Lodderand IPv6 addresses shall be returned only if 148eb1db428SRemko Lodderan IPv6 address is configured on the local system. 1496617cf57SGeorge V. Neville-Neil.It Dv AI_CANONNAME 1506617cf57SGeorge V. Neville-NeilIf the 1516617cf57SGeorge V. Neville-Neil.Dv AI_CANONNAME 1526617cf57SGeorge V. Neville-Neilbit is set, a successful call to 1536617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 1546617cf57SGeorge V. Neville-Neilwill return a NUL-terminated string containing the canonical name 1556617cf57SGeorge V. Neville-Neilof the specified hostname in the 1566617cf57SGeorge V. Neville-Neil.Fa ai_canonname 1576617cf57SGeorge V. Neville-Neilelement of the first 1586617cf57SGeorge V. Neville-Neil.Li addrinfo 1596617cf57SGeorge V. Neville-Neilstructure returned. 1606617cf57SGeorge V. Neville-Neil.It Dv AI_NUMERICHOST 1616617cf57SGeorge V. Neville-NeilIf the 1626617cf57SGeorge V. Neville-Neil.Dv AI_NUMERICHOST 1636617cf57SGeorge V. Neville-Neilbit is set, it indicates that 1646617cf57SGeorge V. Neville-Neil.Fa hostname 1656617cf57SGeorge V. Neville-Neilshould be treated as a numeric string defining an IPv4 or IPv6 address 1666617cf57SGeorge V. Neville-Neiland no name resolution should be attempted. 167eb1db428SRemko Lodder.It Dv AI_NUMERICSERV 168eb1db428SRemko LodderIf the 169eb1db428SRemko Lodder.Dv AI_NUMERICSERV 170eb1db428SRemko Lodderbit is set, 171eb1db428SRemko Lodderthen a non-null 172eb1db428SRemko Lodder.Fa servname 173eb1db428SRemko Lodderstring supplied shall be a numeric port string. 174eb1db428SRemko LodderOtherwise, an 175eb1db428SRemko Lodder.Dv EAI_NONAME 176eb1db428SRemko Loddererror shall be returned. 177eb1db428SRemko LodderThis bit shall prevent any type of name resolution service 178eb1db428SRemko Lodder(for example, NIS+) from being invoked. 1796617cf57SGeorge V. Neville-Neil.It Dv AI_PASSIVE 1806617cf57SGeorge V. Neville-NeilIf the 1816617cf57SGeorge V. Neville-Neil.Dv AI_PASSIVE 1826617cf57SGeorge V. Neville-Neilbit is set it indicates that the returned socket address structure 1836617cf57SGeorge V. Neville-Neilis intended for use in a call to 1846617cf57SGeorge V. Neville-Neil.Xr bind 2 . 1856617cf57SGeorge V. Neville-NeilIn this case, if the 1866617cf57SGeorge V. Neville-Neil.Fa hostname 1876617cf57SGeorge V. Neville-Neilargument is the null pointer, then the IP address portion of the 1886617cf57SGeorge V. Neville-Neilsocket address structure will be set to 1896617cf57SGeorge V. Neville-Neil.Dv INADDR_ANY 1906617cf57SGeorge V. Neville-Neilfor an IPv4 address or 1916617cf57SGeorge V. Neville-Neil.Dv IN6ADDR_ANY_INIT 1926617cf57SGeorge V. Neville-Neilfor an IPv6 address. 1936617cf57SGeorge V. Neville-Neil.Pp 1946617cf57SGeorge V. Neville-NeilIf the 1956617cf57SGeorge V. Neville-Neil.Dv AI_PASSIVE 1966617cf57SGeorge V. Neville-Neilbit is not set, the returned socket address structure will be ready 1976617cf57SGeorge V. Neville-Neilfor use in a call to 1986617cf57SGeorge V. Neville-Neil.Xr connect 2 1996617cf57SGeorge V. Neville-Neilfor a connection-oriented protocol or 2006617cf57SGeorge V. Neville-Neil.Xr connect 2 , 2016617cf57SGeorge V. Neville-Neil.Xr sendto 2 , 2026617cf57SGeorge V. Neville-Neilor 2036617cf57SGeorge V. Neville-Neil.Xr sendmsg 2 2046617cf57SGeorge V. Neville-Neilif a connectionless protocol was chosen. 2056617cf57SGeorge V. Neville-NeilThe 2066617cf57SGeorge V. Neville-Neil.Tn IP 2076617cf57SGeorge V. Neville-Neiladdress portion of the socket address structure will be set to the 2086617cf57SGeorge V. Neville-Neilloopback address if 2096617cf57SGeorge V. Neville-Neil.Fa hostname 2106617cf57SGeorge V. Neville-Neilis the null pointer and 2116617cf57SGeorge V. Neville-Neil.Dv AI_PASSIVE 2126617cf57SGeorge V. Neville-Neilis not set. 2136617cf57SGeorge V. Neville-Neil.El 2146617cf57SGeorge V. Neville-Neil.El 2156617cf57SGeorge V. Neville-Neil.Pp 2166617cf57SGeorge V. Neville-NeilAll other elements of the 2176617cf57SGeorge V. Neville-Neil.Li addrinfo 2186617cf57SGeorge V. Neville-Neilstructure passed via 2196617cf57SGeorge V. Neville-Neil.Fa hints 2206617cf57SGeorge V. Neville-Neilmust be zero or the null pointer. 2216617cf57SGeorge V. Neville-Neil.Pp 2226617cf57SGeorge V. Neville-NeilIf 2236617cf57SGeorge V. Neville-Neil.Fa hints 2246617cf57SGeorge V. Neville-Neilis the null pointer, 2256617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 2266617cf57SGeorge V. Neville-Neilbehaves as if the caller provided a 2276617cf57SGeorge V. Neville-Neil.Li struct addrinfo 2286617cf57SGeorge V. Neville-Neilwith 2296617cf57SGeorge V. Neville-Neil.Fa ai_family 2306617cf57SGeorge V. Neville-Neilset to 2316617cf57SGeorge V. Neville-Neil.Dv PF_UNSPEC 2326617cf57SGeorge V. Neville-Neiland all other elements set to zero or 2336617cf57SGeorge V. Neville-Neil.Dv NULL . 2346617cf57SGeorge V. Neville-Neil.Pp 2356617cf57SGeorge V. Neville-NeilAfter a successful call to 2366617cf57SGeorge V. Neville-Neil.Fn getaddrinfo , 2376617cf57SGeorge V. Neville-Neil.Fa *res 2386617cf57SGeorge V. Neville-Neilis a pointer to a linked list of one or more 2396617cf57SGeorge V. Neville-Neil.Li addrinfo 2406617cf57SGeorge V. Neville-Neilstructures. 2416617cf57SGeorge V. Neville-NeilThe list can be traversed by following the 2426617cf57SGeorge V. Neville-Neil.Fa ai_next 2436617cf57SGeorge V. Neville-Neilpointer in each 2446617cf57SGeorge V. Neville-Neil.Li addrinfo 2456617cf57SGeorge V. Neville-Neilstructure until a null pointer is encountered. 2466617cf57SGeorge V. Neville-NeilThe three members 2476617cf57SGeorge V. Neville-Neil.Fa ai_family , 2486617cf57SGeorge V. Neville-Neil.Fa ai_socktype , 2496617cf57SGeorge V. Neville-Neiland 2506617cf57SGeorge V. Neville-Neil.Fa ai_protocol 2516617cf57SGeorge V. Neville-Neilin each returned 2526617cf57SGeorge V. Neville-Neil.Li addrinfo 2536617cf57SGeorge V. Neville-Neilstructure are suitable for a call to 2546617cf57SGeorge V. Neville-Neil.Xr socket 2 . 2556617cf57SGeorge V. Neville-NeilFor each 2566617cf57SGeorge V. Neville-Neil.Li addrinfo 2576617cf57SGeorge V. Neville-Neilstructure in the list, the 2586617cf57SGeorge V. Neville-Neil.Fa ai_addr 2596617cf57SGeorge V. Neville-Neilmember points to a filled-in socket address structure of length 2606617cf57SGeorge V. Neville-Neil.Fa ai_addrlen . 2616617cf57SGeorge V. Neville-Neil.Pp 2626617cf57SGeorge V. Neville-NeilThis implementation of 2636617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 2646617cf57SGeorge V. Neville-Neilallows numeric IPv6 address notation with scope identifier, 2654e4f91b8SHiroki Satoas documented in chapter 11 of RFC 4007. 2666617cf57SGeorge V. Neville-NeilBy appending the percent character and scope identifier to addresses, 2676617cf57SGeorge V. Neville-Neilone can fill the 2686617cf57SGeorge V. Neville-Neil.Li sin6_scope_id 2696617cf57SGeorge V. Neville-Neilfield for addresses. 2706617cf57SGeorge V. Neville-NeilThis would make management of scoped addresses easier 2716617cf57SGeorge V. Neville-Neiland allows cut-and-paste input of scoped addresses. 2726617cf57SGeorge V. Neville-Neil.Pp 2736617cf57SGeorge V. Neville-NeilAt this moment the code supports only link-local addresses with the format. 2746617cf57SGeorge V. Neville-NeilThe scope identifier is hardcoded to the name of the hardware interface 2756617cf57SGeorge V. Neville-Neilassociated 2766617cf57SGeorge V. Neville-Neilwith the link 2776617cf57SGeorge V. Neville-Neil.Po 2786617cf57SGeorge V. Neville-Neilsuch as 2796617cf57SGeorge V. Neville-Neil.Li ne0 2806617cf57SGeorge V. Neville-Neil.Pc . 2816617cf57SGeorge V. Neville-NeilAn example is 2826617cf57SGeorge V. Neville-Neil.Dq Li fe80::1%ne0 , 2836617cf57SGeorge V. Neville-Neilwhich means 2846617cf57SGeorge V. Neville-Neil.Do 2856617cf57SGeorge V. Neville-Neil.Li fe80::1 2866617cf57SGeorge V. Neville-Neilon the link associated with the 2876617cf57SGeorge V. Neville-Neil.Li ne0 2886617cf57SGeorge V. Neville-Neilinterface 2896617cf57SGeorge V. Neville-Neil.Dc . 2906617cf57SGeorge V. Neville-Neil.Pp 2916617cf57SGeorge V. Neville-NeilThe current implementation assumes a one-to-one relationship between 2926617cf57SGeorge V. Neville-Neilthe interface and link, which is not necessarily true from the specification. 2936617cf57SGeorge V. Neville-Neil.Pp 2946617cf57SGeorge V. Neville-NeilAll of the information returned by 2956617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 2966617cf57SGeorge V. Neville-Neilis dynamically allocated: the 2976617cf57SGeorge V. Neville-Neil.Li addrinfo 2986617cf57SGeorge V. Neville-Neilstructures themselves as well as the socket address structures and 2996617cf57SGeorge V. Neville-Neilthe canonical host name strings included in the 3006617cf57SGeorge V. Neville-Neil.Li addrinfo 3016617cf57SGeorge V. Neville-Neilstructures. 3026617cf57SGeorge V. Neville-Neil.Pp 3036617cf57SGeorge V. Neville-NeilMemory allocated for the dynamically allocated structures created by 3046617cf57SGeorge V. Neville-Neila successful call to 3056617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 3066617cf57SGeorge V. Neville-Neilis released by the 3076617cf57SGeorge V. Neville-Neil.Fn freeaddrinfo 3086617cf57SGeorge V. Neville-Neilfunction. 3096617cf57SGeorge V. Neville-NeilThe 3106617cf57SGeorge V. Neville-Neil.Fa ai 3116617cf57SGeorge V. Neville-Neilpointer should be a 3126617cf57SGeorge V. Neville-Neil.Li addrinfo 3136617cf57SGeorge V. Neville-Neilstructure created by a call to 3146617cf57SGeorge V. Neville-Neil.Fn getaddrinfo . 3156617cf57SGeorge V. Neville-Neil.Sh RETURN VALUES 3166617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 3176617cf57SGeorge V. Neville-Neilreturns zero on success or one of the error codes listed in 3186617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3 3196617cf57SGeorge V. Neville-Neilif an error occurs. 3206617cf57SGeorge V. Neville-Neil.Sh EXAMPLES 3216617cf57SGeorge V. Neville-NeilThe following code tries to connect to 3226617cf57SGeorge V. Neville-Neil.Dq Li www.kame.net 3236617cf57SGeorge V. Neville-Neilservice 3246617cf57SGeorge V. Neville-Neil.Dq Li http 3256617cf57SGeorge V. Neville-Neilvia a stream socket. 3266617cf57SGeorge V. Neville-NeilIt loops through all the addresses available, regardless of address family. 3276617cf57SGeorge V. Neville-NeilIf the destination resolves to an IPv4 address, it will use an 3286617cf57SGeorge V. Neville-Neil.Dv AF_INET 3296617cf57SGeorge V. Neville-Neilsocket. 3306617cf57SGeorge V. Neville-NeilSimilarly, if it resolves to IPv6, an 3316617cf57SGeorge V. Neville-Neil.Dv AF_INET6 3326617cf57SGeorge V. Neville-Neilsocket is used. 3336617cf57SGeorge V. Neville-NeilObserve that there is no hardcoded reference to a particular address family. 3346617cf57SGeorge V. Neville-NeilThe code works even if 3356617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 3366617cf57SGeorge V. Neville-Neilreturns addresses that are not IPv4/v6. 3376617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent 3386617cf57SGeorge V. Neville-Neilstruct addrinfo hints, *res, *res0; 3396617cf57SGeorge V. Neville-Neilint error; 3406617cf57SGeorge V. Neville-Neilint s; 3416617cf57SGeorge V. Neville-Neilconst char *cause = NULL; 3426617cf57SGeorge V. Neville-Neil 3436617cf57SGeorge V. Neville-Neilmemset(&hints, 0, sizeof(hints)); 3446617cf57SGeorge V. Neville-Neilhints.ai_family = PF_UNSPEC; 3456617cf57SGeorge V. Neville-Neilhints.ai_socktype = SOCK_STREAM; 3466617cf57SGeorge V. Neville-Neilerror = getaddrinfo("www.kame.net", "http", &hints, &res0); 3476617cf57SGeorge V. Neville-Neilif (error) { 3486617cf57SGeorge V. Neville-Neil errx(1, "%s", gai_strerror(error)); 3496617cf57SGeorge V. Neville-Neil /* NOTREACHED */ 3506617cf57SGeorge V. Neville-Neil} 3516617cf57SGeorge V. Neville-Neils = -1; 3526617cf57SGeorge V. Neville-Neilfor (res = res0; res; res = res->ai_next) { 3536617cf57SGeorge V. Neville-Neil s = socket(res->ai_family, res->ai_socktype, 3546617cf57SGeorge V. Neville-Neil res->ai_protocol); 3556617cf57SGeorge V. Neville-Neil if (s < 0) { 3566617cf57SGeorge V. Neville-Neil cause = "socket"; 3576617cf57SGeorge V. Neville-Neil continue; 3586617cf57SGeorge V. Neville-Neil } 3596617cf57SGeorge V. Neville-Neil 3606617cf57SGeorge V. Neville-Neil if (connect(s, res->ai_addr, res->ai_addrlen) < 0) { 3616617cf57SGeorge V. Neville-Neil cause = "connect"; 3626617cf57SGeorge V. Neville-Neil close(s); 3636617cf57SGeorge V. Neville-Neil s = -1; 3646617cf57SGeorge V. Neville-Neil continue; 3656617cf57SGeorge V. Neville-Neil } 3666617cf57SGeorge V. Neville-Neil 3676617cf57SGeorge V. Neville-Neil break; /* okay we got one */ 3686617cf57SGeorge V. Neville-Neil} 3696617cf57SGeorge V. Neville-Neilif (s < 0) { 3706617cf57SGeorge V. Neville-Neil err(1, "%s", cause); 3716617cf57SGeorge V. Neville-Neil /* NOTREACHED */ 3726617cf57SGeorge V. Neville-Neil} 3736617cf57SGeorge V. Neville-Neilfreeaddrinfo(res0); 3746617cf57SGeorge V. Neville-Neil.Ed 3756617cf57SGeorge V. Neville-Neil.Pp 3766617cf57SGeorge V. Neville-NeilThe following example tries to open a wildcard listening socket onto service 3776617cf57SGeorge V. Neville-Neil.Dq Li http , 3786617cf57SGeorge V. Neville-Neilfor all the address families available. 3796617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent 3806617cf57SGeorge V. Neville-Neilstruct addrinfo hints, *res, *res0; 3816617cf57SGeorge V. Neville-Neilint error; 3826617cf57SGeorge V. Neville-Neilint s[MAXSOCK]; 3836617cf57SGeorge V. Neville-Neilint nsock; 3846617cf57SGeorge V. Neville-Neilconst char *cause = NULL; 3856617cf57SGeorge V. Neville-Neil 3866617cf57SGeorge V. Neville-Neilmemset(&hints, 0, sizeof(hints)); 3876617cf57SGeorge V. Neville-Neilhints.ai_family = PF_UNSPEC; 3886617cf57SGeorge V. Neville-Neilhints.ai_socktype = SOCK_STREAM; 3896617cf57SGeorge V. Neville-Neilhints.ai_flags = AI_PASSIVE; 3906617cf57SGeorge V. Neville-Neilerror = getaddrinfo(NULL, "http", &hints, &res0); 3916617cf57SGeorge V. Neville-Neilif (error) { 3926617cf57SGeorge V. Neville-Neil errx(1, "%s", gai_strerror(error)); 3936617cf57SGeorge V. Neville-Neil /* NOTREACHED */ 3946617cf57SGeorge V. Neville-Neil} 3956617cf57SGeorge V. Neville-Neilnsock = 0; 3966617cf57SGeorge V. Neville-Neilfor (res = res0; res && nsock < MAXSOCK; res = res->ai_next) { 3976617cf57SGeorge V. Neville-Neil s[nsock] = socket(res->ai_family, res->ai_socktype, 3986617cf57SGeorge V. Neville-Neil res->ai_protocol); 3996617cf57SGeorge V. Neville-Neil if (s[nsock] < 0) { 4006617cf57SGeorge V. Neville-Neil cause = "socket"; 4016617cf57SGeorge V. Neville-Neil continue; 4026617cf57SGeorge V. Neville-Neil } 4036617cf57SGeorge V. Neville-Neil 4046617cf57SGeorge V. Neville-Neil if (bind(s[nsock], res->ai_addr, res->ai_addrlen) < 0) { 4056617cf57SGeorge V. Neville-Neil cause = "bind"; 4066617cf57SGeorge V. Neville-Neil close(s[nsock]); 4076617cf57SGeorge V. Neville-Neil continue; 4086617cf57SGeorge V. Neville-Neil } 4096617cf57SGeorge V. Neville-Neil (void) listen(s[nsock], 5); 4106617cf57SGeorge V. Neville-Neil 4116617cf57SGeorge V. Neville-Neil nsock++; 4126617cf57SGeorge V. Neville-Neil} 4136617cf57SGeorge V. Neville-Neilif (nsock == 0) { 4146617cf57SGeorge V. Neville-Neil err(1, "%s", cause); 4156617cf57SGeorge V. Neville-Neil /* NOTREACHED */ 4166617cf57SGeorge V. Neville-Neil} 4176617cf57SGeorge V. Neville-Neilfreeaddrinfo(res0); 4186617cf57SGeorge V. Neville-Neil.Ed 4196617cf57SGeorge V. Neville-Neil.Sh SEE ALSO 4206617cf57SGeorge V. Neville-Neil.Xr bind 2 , 4216617cf57SGeorge V. Neville-Neil.Xr connect 2 , 4226617cf57SGeorge V. Neville-Neil.Xr send 2 , 4236617cf57SGeorge V. Neville-Neil.Xr socket 2 , 4246617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3 , 4256617cf57SGeorge V. Neville-Neil.Xr gethostbyname 3 , 4266617cf57SGeorge V. Neville-Neil.Xr getnameinfo 3 , 4276617cf57SGeorge V. Neville-Neil.Xr getservbyname 3 , 4286617cf57SGeorge V. Neville-Neil.Xr resolver 3 , 429*bb957021SHiroki Sato.Xr inet 4 , 430*bb957021SHiroki Sato.Xr inet6 4 , 431*bb957021SHiroki Sato.Xr unix 4 , 4326617cf57SGeorge V. Neville-Neil.Xr hosts 5 , 4336617cf57SGeorge V. Neville-Neil.Xr resolv.conf 5 , 4346617cf57SGeorge V. Neville-Neil.Xr services 5 , 4356617cf57SGeorge V. Neville-Neil.Xr hostname 7 , 4366617cf57SGeorge V. Neville-Neil.Xr named 8 4376617cf57SGeorge V. Neville-Neil.Rs 4386617cf57SGeorge V. Neville-Neil.%A R. Gilligan 4396617cf57SGeorge V. Neville-Neil.%A S. Thomson 4406617cf57SGeorge V. Neville-Neil.%A J. Bound 4416617cf57SGeorge V. Neville-Neil.%A J. McCann 4426617cf57SGeorge V. Neville-Neil.%A W. Stevens 4436617cf57SGeorge V. Neville-Neil.%T Basic Socket Interface Extensions for IPv6 4446617cf57SGeorge V. Neville-Neil.%R RFC 3493 4456617cf57SGeorge V. Neville-Neil.%D February 2003 4466617cf57SGeorge V. Neville-Neil.Re 4476617cf57SGeorge V. Neville-Neil.Rs 4486617cf57SGeorge V. Neville-Neil.%A S. Deering 4496617cf57SGeorge V. Neville-Neil.%A B. Haberman 4506617cf57SGeorge V. Neville-Neil.%A T. Jinmei 4516617cf57SGeorge V. Neville-Neil.%A E. Nordmark 4526617cf57SGeorge V. Neville-Neil.%A B. Zill 4536617cf57SGeorge V. Neville-Neil.%T "IPv6 Scoped Address Architecture" 4544e4f91b8SHiroki Sato.%R RFC 4007 4554e4f91b8SHiroki Sato.%D March 2005 4566617cf57SGeorge V. Neville-Neil.Re 4576617cf57SGeorge V. Neville-Neil.Rs 4586617cf57SGeorge V. Neville-Neil.%A Craig Metz 4596617cf57SGeorge V. Neville-Neil.%T Protocol Independence Using the Sockets API 4606617cf57SGeorge V. Neville-Neil.%B "Proceedings of the freenix track: 2000 USENIX annual technical conference" 4616617cf57SGeorge V. Neville-Neil.%D June 2000 4626617cf57SGeorge V. Neville-Neil.Re 4636617cf57SGeorge V. Neville-Neil.Sh STANDARDS 4646617cf57SGeorge V. Neville-NeilThe 4656617cf57SGeorge V. Neville-Neil.Fn getaddrinfo 4666617cf57SGeorge V. Neville-Neilfunction is defined by the 467eb1db428SRemko Lodder.St -p1003.1-2004 468eb1db428SRemko Lodderspecification and documented in 4696617cf57SGeorge V. Neville-Neil.Dv "RFC 3493" , 4706617cf57SGeorge V. Neville-Neil.Dq Basic Socket Interface Extensions for IPv6 . 471