File: README

package info (click to toggle)
libsocket-getaddrinfo-perl 0.22-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 444 kB
  • ctags: 748
  • sloc: perl: 964; makefile: 14
file content (327 lines) | stat: -rw-r--r-- 12,817 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
NAME
    `Socket::GetAddrInfo' - address-family independent name resolving
    functions

SYNOPSIS
     use Socket qw( SOCK_STREAM );
     use Socket::GetAddrInfo qw( getaddrinfo getnameinfo );
     use IO::Socket;

     my %hints = ( socktype => SOCK_STREAM );
     my ( $err, @res ) = getaddrinfo( "www.google.com", "www", \%hints );

     die "Cannot resolve name - $err" if $err;

     my $sock;

     foreach my $ai ( @res ) {
        my $candidate = IO::Socket->new();

        $candidate->socket( $ai->{family}, $ai->{socktype}, $ai->{protocol} )
           or next;

        $candidate->connect( $ai->{addr} )
           or next;

        $sock = $candidate;
        last;
     }

     if( $sock ) {
        my ( $err, $host, $service ) = getnameinfo( $sock->peername );
        print "Connected to $host:$service\n" if !$err;
     }

DESCRIPTION
    The RFC 2553 functions `getaddrinfo' and `getnameinfo' provide an
    abstracted way to convert between a pair of host name/service name and
    socket addresses, or vice versa. `getaddrinfo' converts names into a set
    of arguments to pass to the `socket()' and `connect()' syscalls, and
    `getnameinfo' converts a socket address back into its host name/service
    name pair.

    These functions provide a useful interface for performing either of
    these name resolution operation, without having to deal with IPv4/IPv6
    transparency, or whether the underlying host can support IPv6 at all, or
    other such issues. However, not all platforms can support the underlying
    calls at the C layer, which means a dilema for authors wishing to write
    forward-compatible code. Either to support these functions, and cause
    the code not to work on older platforms, or stick to the older "legacy"
    resolvers such as `gethostbyname()', which means the code becomes more
    portable.

    This module attempts to solve this problem, by detecting at compiletime
    whether the underlying OS will support these functions. If it does not,
    the module will use pure-perl emulations of the functions using the
    legacy resolver functions instead. The emulations support the same
    interface as the real functions, and behave as close as is resonably
    possible to emulate using the legacy resolvers. See
    Socket::GetAddrInfo::Emul for details on the limits of this emulation.

    As of Perl version 5.14.0, Perl already supports `getaddrinfo' in core.
    On such a system, this module simply uses the functions provided by
    `Socket', and does not need to use its own compiled XS, or pure-perl
    legacy emulation.

    As `Socket' in core now provides all the functions also provided by this
    module, it is likely this may be the last released version of this
    module. And code currently using this module would be advised to switch
    to using core `Socket' instead.

EXPORT TAGS
    The following tags may be imported by `use Socket::GetAddrInfo qw( :tag
    )':

    AI      Imports all of the `AI_*' constants for `getaddrinfo' flags

    NI      Imports all of the `NI_*' constants for `getnameinfo' flags

    EAI     Imports all of the `EAI_*' for error values

    constants
            Imports all of the above constants

FUNCTIONS
  ( $err, @res ) = getaddrinfo( $host, $service, $hints )
    `getaddrinfo' turns human-readable text strings (containing hostnames,
    numeric addresses, service names, or port numbers) into sets of binary
    values containing socket-level representations of these addresses.

    When given both host and service, this function attempts to resolve the
    host name to a set of network addresses, and the service name into a
    protocol and port number, and then returns a list of address structures
    suitable to connect() to it.

    When given just a host name, this function attempts to resolve it to a
    set of network addresses, and then returns a list of these addresses in
    the returned structures.

    When given just a service name, this function attempts to resolve it to
    a protocol and port number, and then returns a list of address
    structures that represent it suitable to bind() to.

    When given neither name, it generates an error.

    The optional `$hints' parameter can be passed a HASH reference to
    indicate how the results are generated. It may contain any of the
    following four fields:

    flags => INT
            A bitfield containing `AI_*' constants. At least the following
            flags will be available:

            * `AI_PASSIVE'
              Indicates that this resolution is for a local `bind()' for a
              passive (i.e. listening) socket, rather than an active (i.e.
              connecting) socket.

            * `AI_CANONNAME'
              Indicates that the caller wishes the canonical hostname
              (`canonname') field of the result to be filled in.

            * `AI_NUMERICHOST'
              Indicates that the caller will pass a numeric address, rather
              than a hostname, and that `getaddrinfo' must not perform a
              resolve operation on this name. This flag will prevent a
              possibly-slow network lookup operation, and instead return an
              error, if a hostname is passed.

            Other flags may be provided by the OS.

    family => INT
            Restrict to only generating addresses in this address family

    socktype => INT
            Restrict to only generating addresses of this socket type

    protocol => INT
            Restrict to only generating addresses for this protocol

    Errors are indicated by the `$err' value returned; which will be
    non-zero in numeric context, and contain a string error message as a
    string. The value can be compared against any of the `EAI_*' constants
    to determine what the error is. Rather than explicitly checking, see
    also Socket::GetAddrInfo::Strict which provides functions that throw
    exceptions on errors.

    If no error occurs, `@res' will contain HASH references, each
    representing one address. It will contain the following five fields:

    family => INT
            The address family (e.g. AF_INET)

    socktype => INT
            The socket type (e.g. SOCK_STREAM)

    protocol => INT
            The protocol (e.g. IPPROTO_TCP)

    addr => STRING
            The address in a packed string (such as would be returned by
            pack_sockaddr_in)

    canonname => STRING
            The canonical name for the host if the `AI_CANONNAME' flag was
            provided, or `undef' otherwise. This field will only be present
            on the first returned address.

  ( $err, $host, $service ) = getnameinfo( $addr, $flags, $xflags )
    `getnameinfo' turns a binary socket address into a pair of
    human-readable strings, containing the host name, numeric address,
    service name, or port number.

    The optional `$flags' parameter is a bitfield containing `NI_*'
    constants. At least the following flags will be available:

    * `NI_NUMERICHOST'
      Requests that a human-readable string representation of the numeric
      address is returned directly, rather than performing a name resolve
      operation that may convert it into a hostname.

    * `NI_NUMERICSERV'
      Requests that the port number be returned directly as a number
      representation rather than performing a name resolve operation that
      may convert it into a service name.

    * `NI_NAMEREQD'
      If a name resolve operation fails to provide a name, then this flag
      will cause `getnameinfo' to indicate an error, rather than returning
      the numeric representation as a human-readable string.

    * `NI_DGRAM'
      Indicates that the socket address relates to a `SOCK_DGRAM' socket,
      for the services whose name differs between `TCP' and `UDP' protocols.

    Other flags may be provided by the OS.

    The optional `$xflags' parameter is a bitfield containing `NIx_*'
    constants. These are a Perl-level extension to the API, to indicate
    extra information.

    * `NIx_NOHOST'
      Indicates that the caller is not interested in the hostname of the
      result, so it does not have to be converted; `undef' will be returned
      as the hostname.

    * `NIx_NOSERV'
      Indicates that the caller is not interested in the service name of the
      result, so it does not have to be converted; `undef' will be returned
      as the service name.

    Errors are indicated by the `$err' value returned; which will be
    non-zero in numeric context, and contain a string error message as a
    string. The value can be compared against any of the `EAI_*' constants
    to determine what the error is. Rather than explicitly checking, see
    also Socket::GetAddrInfo::Strict which provides functions that throw
    exceptions on errors.

EXAMPLES
  Lookup for `connect'
    The `getaddrinfo' function converts a hostname and a service name into a
    list of structures, each containing a potential way to `connect()' to
    the named service on the named host.

     my %hints = ( socktype => SOCK_STREAM );
     my ( $err, @res ) = getaddrinfo( $hostname, $servicename, \%hints );
     die "Cannot getaddrinfo - $err" if $err;

     my $sock;

     foreach my $ai ( @res ) {
        my $candidate = IO::Socket->new();

        $candidate->socket( $ai->{family}, $ai->{socktype}, $ai->{protocol} )
           or next;

        $candidate->connect( $ai->{addr} )
           or next;

        $sock = $candidate;
        last;
     }

    Because a list of potential candidates is returned, the `while' loop
    tries each in turn until it it finds one that succeeds both the
    `socket()' and `connect()' calls.

    This function performs the work of the legacy functions `gethostbyname',
    `getservbyname', `inet_aton' and `pack_sockaddr_in'.

  Making a human-readable string out of an address
    The `getnameinfo' function converts a socket address, such as returned
    by `getsockname' or `getpeername', into a pair of human-readable strings
    representing the address and service name.

     my ( $err, $hostname, $servicename ) = getnameinfo( $socket->peername );
     die "Cannot getnameinfo - $err" if $err;

     print "The peer is connected from $hostname\n";

    Since in this example only the hostname was used, the redundant
    conversion of the port number into a service name may be omitted by
    passing the `NIx_NOSERV' flag.

     my ( $err, $hostname ) = getnameinfo( $socket->peername, 0, NIx_NOSERV );

    This function performs the work of the legacy functions
    `unpack_sockaddr_in', `inet_ntoa', `gethostbyaddr' and `getservbyport'.

  Resolving hostnames into IP addresses
    To turn a hostname into a human-readable plain IP address use
    `getaddrinfo' to turn the hostname into a list of socket structures,
    then `getnameinfo' on each one to make it a readable IP address again.

     my ( $err, @res ) = getaddrinfo( $hostname, "", { socktype => SOCK_RAW } );
     die "Cannot getaddrinfo - $err" if $err;

     while( my $ai = shift @res ) {
        my ( $err, $ipaddr ) = getnameinfo( $ai->{addr}, NI_NUMERICHOST, NIx_NOSERV );
        die "Cannot getnameinfo - $err" if $err;

        print "$ipaddr\n";
     }

    The `socktype' hint to `getaddrinfo' filters the results to only include
    one socket type and protocol. Without this most OSes return three
    combinations, for `SOCK_STREAM', `SOCK_DGRAM' and `SOCK_RAW', resulting
    in triplicate output of addresses. The `NI_NUMERICHOST' flag to
    `getnameinfo' causes it to return a string-formatted plain IP address,
    rather than reverse resolving it back into a hostname.

    This combination performs the work of the legacy functions
    `gethostbyname' and `inet_ntoa'.

BUILDING WITHOUT XS CODE
    In some environments it may be preferred not to build the XS
    implementation, leaving a choice only of the core or pure-perl emulation
    implementations.

     $ perl Build.PL --pp

    or

     $ PERL_SOCKET_GETADDRINFO_NO_BUILD_XS=1 perl Build.PL 

BUGS
    *   Appears to FAIL on older Darwin machines (e.g. `osvers=8.11.1'). The
        failure mode occurs in t/02getnameinfo.t and appears to relate to an
        endian bug; expecting to receive `80' and instead receiving `20480'
        (which is a 16-bit `80' byte-swapped).

SEE ALSO
    *   http://tools.ietf.org/html/rfc2553 - Basic Socket Interface
        Extensions for IPv6

ACKNOWLEDGEMENTS
    Christian Hansen <chansen@cpan.org> - for help with some XS features and
    Win32 build fixes.

    Zefram <zefram@fysh.org> - for help with fixing some bugs in the XS
    code.

    Reini Urban <rurban@cpan.org> - for help with older perls and more Win32
    build fixes.

AUTHOR
    Paul Evans <leonerd@leonerd.org.uk>