| 1 | package Socket;
|
|---|
| 2 |
|
|---|
| 3 | our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
|
|---|
| 4 | $VERSION = "1.78";
|
|---|
| 5 |
|
|---|
| 6 | =head1 NAME
|
|---|
| 7 |
|
|---|
| 8 | Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C socket.h defines and structure manipulators
|
|---|
| 9 |
|
|---|
| 10 | =head1 SYNOPSIS
|
|---|
| 11 |
|
|---|
| 12 | use Socket;
|
|---|
| 13 |
|
|---|
| 14 | $proto = getprotobyname('udp');
|
|---|
| 15 | socket(Socket_Handle, PF_INET, SOCK_DGRAM, $proto);
|
|---|
| 16 | $iaddr = gethostbyname('hishost.com');
|
|---|
| 17 | $port = getservbyname('time', 'udp');
|
|---|
| 18 | $sin = sockaddr_in($port, $iaddr);
|
|---|
| 19 | send(Socket_Handle, 0, 0, $sin);
|
|---|
| 20 |
|
|---|
| 21 | $proto = getprotobyname('tcp');
|
|---|
| 22 | socket(Socket_Handle, PF_INET, SOCK_STREAM, $proto);
|
|---|
| 23 | $port = getservbyname('smtp', 'tcp');
|
|---|
| 24 | $sin = sockaddr_in($port,inet_aton("127.1"));
|
|---|
| 25 | $sin = sockaddr_in(7,inet_aton("localhost"));
|
|---|
| 26 | $sin = sockaddr_in(7,INADDR_LOOPBACK);
|
|---|
| 27 | connect(Socket_Handle,$sin);
|
|---|
| 28 |
|
|---|
| 29 | ($port, $iaddr) = sockaddr_in(getpeername(Socket_Handle));
|
|---|
| 30 | $peer_host = gethostbyaddr($iaddr, AF_INET);
|
|---|
| 31 | $peer_addr = inet_ntoa($iaddr);
|
|---|
| 32 |
|
|---|
| 33 | $proto = getprotobyname('tcp');
|
|---|
| 34 | socket(Socket_Handle, PF_UNIX, SOCK_STREAM, $proto);
|
|---|
| 35 | unlink('/var/run/usock');
|
|---|
| 36 | $sun = sockaddr_un('/var/run/usock');
|
|---|
| 37 | connect(Socket_Handle,$sun);
|
|---|
| 38 |
|
|---|
| 39 | =head1 DESCRIPTION
|
|---|
| 40 |
|
|---|
| 41 | This module is just a translation of the C F<socket.h> file.
|
|---|
| 42 | Unlike the old mechanism of requiring a translated F<socket.ph>
|
|---|
| 43 | file, this uses the B<h2xs> program (see the Perl source distribution)
|
|---|
| 44 | and your native C compiler. This means that it has a
|
|---|
| 45 | far more likely chance of getting the numbers right. This includes
|
|---|
| 46 | all of the commonly used pound-defines like AF_INET, SOCK_STREAM, etc.
|
|---|
| 47 |
|
|---|
| 48 | Also, some common socket "newline" constants are provided: the
|
|---|
| 49 | constants C<CR>, C<LF>, and C<CRLF>, as well as C<$CR>, C<$LF>, and
|
|---|
| 50 | C<$CRLF>, which map to C<\015>, C<\012>, and C<\015\012>. If you do
|
|---|
| 51 | not want to use the literal characters in your programs, then use
|
|---|
| 52 | the constants provided here. They are not exported by default, but can
|
|---|
| 53 | be imported individually, and with the C<:crlf> export tag:
|
|---|
| 54 |
|
|---|
| 55 | use Socket qw(:DEFAULT :crlf);
|
|---|
| 56 |
|
|---|
| 57 | In addition, some structure manipulation functions are available:
|
|---|
| 58 |
|
|---|
| 59 | =over 4
|
|---|
| 60 |
|
|---|
| 61 | =item inet_aton HOSTNAME
|
|---|
| 62 |
|
|---|
| 63 | Takes a string giving the name of a host, and translates that to an
|
|---|
| 64 | opaque string (if programming in C, struct in_addr). Takes arguments
|
|---|
| 65 | of both the 'rtfm.mit.edu' type and '18.181.0.24'. If the host name
|
|---|
| 66 | cannot be resolved, returns undef. For multi-homed hosts (hosts with
|
|---|
| 67 | more than one address), the first address found is returned.
|
|---|
| 68 |
|
|---|
| 69 | For portability do not assume that the result of inet_aton() is 32
|
|---|
| 70 | bits wide, in other words, that it would contain only the IPv4 address
|
|---|
| 71 | in network order.
|
|---|
| 72 |
|
|---|
| 73 | =item inet_ntoa IP_ADDRESS
|
|---|
| 74 |
|
|---|
| 75 | Takes a string (an opaque string as returned by inet_aton(),
|
|---|
| 76 | or a v-string representing the four octets of the IPv4 address in
|
|---|
| 77 | network order) and translates it into a string of the form 'd.d.d.d'
|
|---|
| 78 | where the 'd's are numbers less than 256 (the normal human-readable
|
|---|
| 79 | four dotted number notation for Internet addresses).
|
|---|
| 80 |
|
|---|
| 81 | =item INADDR_ANY
|
|---|
| 82 |
|
|---|
| 83 | Note: does not return a number, but a packed string.
|
|---|
| 84 |
|
|---|
| 85 | Returns the 4-byte wildcard ip address which specifies any
|
|---|
| 86 | of the hosts ip addresses. (A particular machine can have
|
|---|
| 87 | more than one ip address, each address corresponding to
|
|---|
| 88 | a particular network interface. This wildcard address
|
|---|
| 89 | allows you to bind to all of them simultaneously.)
|
|---|
| 90 | Normally equivalent to inet_aton('0.0.0.0').
|
|---|
| 91 |
|
|---|
| 92 | =item INADDR_BROADCAST
|
|---|
| 93 |
|
|---|
| 94 | Note: does not return a number, but a packed string.
|
|---|
| 95 |
|
|---|
| 96 | Returns the 4-byte 'this-lan' ip broadcast address.
|
|---|
| 97 | This can be useful for some protocols to solicit information
|
|---|
| 98 | from all servers on the same LAN cable.
|
|---|
| 99 | Normally equivalent to inet_aton('255.255.255.255').
|
|---|
| 100 |
|
|---|
| 101 | =item INADDR_LOOPBACK
|
|---|
| 102 |
|
|---|
| 103 | Note - does not return a number.
|
|---|
| 104 |
|
|---|
| 105 | Returns the 4-byte loopback address. Normally equivalent
|
|---|
| 106 | to inet_aton('localhost').
|
|---|
| 107 |
|
|---|
| 108 | =item INADDR_NONE
|
|---|
| 109 |
|
|---|
| 110 | Note - does not return a number.
|
|---|
| 111 |
|
|---|
| 112 | Returns the 4-byte 'invalid' ip address. Normally equivalent
|
|---|
| 113 | to inet_aton('255.255.255.255').
|
|---|
| 114 |
|
|---|
| 115 | =item sockaddr_family SOCKADDR
|
|---|
| 116 |
|
|---|
| 117 | Takes a sockaddr structure (as returned by pack_sockaddr_in(),
|
|---|
| 118 | pack_sockaddr_un() or the perl builtin functions getsockname() and
|
|---|
| 119 | getpeername()) and returns the address family tag. It will match the
|
|---|
| 120 | constant AF_INET for a sockaddr_in and AF_UNIX for a sockaddr_un. It
|
|---|
| 121 | can be used to figure out what unpacker to use for a sockaddr of
|
|---|
| 122 | unknown type.
|
|---|
| 123 |
|
|---|
| 124 | =item sockaddr_in PORT, ADDRESS
|
|---|
| 125 |
|
|---|
| 126 | =item sockaddr_in SOCKADDR_IN
|
|---|
| 127 |
|
|---|
| 128 | In a list context, unpacks its SOCKADDR_IN argument and returns an array
|
|---|
| 129 | consisting of (PORT, ADDRESS). In a scalar context, packs its (PORT,
|
|---|
| 130 | ADDRESS) arguments as a SOCKADDR_IN and returns it. If this is confusing,
|
|---|
| 131 | use pack_sockaddr_in() and unpack_sockaddr_in() explicitly.
|
|---|
| 132 |
|
|---|
| 133 | =item pack_sockaddr_in PORT, IP_ADDRESS
|
|---|
| 134 |
|
|---|
| 135 | Takes two arguments, a port number and an opaque string, IP_ADDRESS
|
|---|
| 136 | (as returned by inet_aton(), or a v-string). Returns the sockaddr_in
|
|---|
| 137 | structure with those arguments packed in with AF_INET filled in. For
|
|---|
| 138 | Internet domain sockets, this structure is normally what you need for
|
|---|
| 139 | the arguments in bind(), connect(), and send(), and is also returned
|
|---|
| 140 | by getpeername(), getsockname() and recv().
|
|---|
| 141 |
|
|---|
| 142 | =item unpack_sockaddr_in SOCKADDR_IN
|
|---|
| 143 |
|
|---|
| 144 | Takes a sockaddr_in structure (as returned by pack_sockaddr_in()) and
|
|---|
| 145 | returns an array of two elements: the port and an opaque string
|
|---|
| 146 | representing the IP address (you can use inet_ntoa() to convert the
|
|---|
| 147 | address to the four-dotted numeric format). Will croak if the
|
|---|
| 148 | structure does not have AF_INET in the right place.
|
|---|
| 149 |
|
|---|
| 150 | =item sockaddr_un PATHNAME
|
|---|
| 151 |
|
|---|
| 152 | =item sockaddr_un SOCKADDR_UN
|
|---|
| 153 |
|
|---|
| 154 | In a list context, unpacks its SOCKADDR_UN argument and returns an array
|
|---|
| 155 | consisting of (PATHNAME). In a scalar context, packs its PATHNAME
|
|---|
| 156 | arguments as a SOCKADDR_UN and returns it. If this is confusing, use
|
|---|
| 157 | pack_sockaddr_un() and unpack_sockaddr_un() explicitly.
|
|---|
| 158 | These are only supported if your system has E<lt>F<sys/un.h>E<gt>.
|
|---|
| 159 |
|
|---|
| 160 | =item pack_sockaddr_un PATH
|
|---|
| 161 |
|
|---|
| 162 | Takes one argument, a pathname. Returns the sockaddr_un structure with
|
|---|
| 163 | that path packed in with AF_UNIX filled in. For unix domain sockets, this
|
|---|
| 164 | structure is normally what you need for the arguments in bind(),
|
|---|
| 165 | connect(), and send(), and is also returned by getpeername(),
|
|---|
| 166 | getsockname() and recv().
|
|---|
| 167 |
|
|---|
| 168 | =item unpack_sockaddr_un SOCKADDR_UN
|
|---|
| 169 |
|
|---|
| 170 | Takes a sockaddr_un structure (as returned by pack_sockaddr_un())
|
|---|
| 171 | and returns the pathname. Will croak if the structure does not
|
|---|
| 172 | have AF_UNIX in the right place.
|
|---|
| 173 |
|
|---|
| 174 | =back
|
|---|
| 175 |
|
|---|
| 176 | =cut
|
|---|
| 177 |
|
|---|
| 178 | use Carp;
|
|---|
| 179 | use warnings::register;
|
|---|
| 180 |
|
|---|
| 181 | require Exporter;
|
|---|
| 182 | use XSLoader ();
|
|---|
| 183 | @ISA = qw(Exporter);
|
|---|
| 184 | @EXPORT = qw(
|
|---|
| 185 | inet_aton inet_ntoa
|
|---|
| 186 | sockaddr_family
|
|---|
| 187 | pack_sockaddr_in unpack_sockaddr_in
|
|---|
| 188 | pack_sockaddr_un unpack_sockaddr_un
|
|---|
| 189 | sockaddr_in sockaddr_un
|
|---|
| 190 | INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE
|
|---|
| 191 | AF_802
|
|---|
| 192 | AF_AAL
|
|---|
| 193 | AF_APPLETALK
|
|---|
| 194 | AF_CCITT
|
|---|
| 195 | AF_CHAOS
|
|---|
| 196 | AF_CTF
|
|---|
| 197 | AF_DATAKIT
|
|---|
| 198 | AF_DECnet
|
|---|
| 199 | AF_DLI
|
|---|
| 200 | AF_ECMA
|
|---|
| 201 | AF_GOSIP
|
|---|
| 202 | AF_HYLINK
|
|---|
| 203 | AF_IMPLINK
|
|---|
| 204 | AF_INET
|
|---|
| 205 | AF_INET6
|
|---|
| 206 | AF_ISO
|
|---|
| 207 | AF_KEY
|
|---|
| 208 | AF_LAST
|
|---|
| 209 | AF_LAT
|
|---|
| 210 | AF_LINK
|
|---|
| 211 | AF_MAX
|
|---|
| 212 | AF_NBS
|
|---|
| 213 | AF_NIT
|
|---|
| 214 | AF_NS
|
|---|
|
|---|