home *** CD-ROM | disk | FTP | other *** search
/ PC World 2004 November / PCWorld_2004-11_cd.bin / software / topware / activeperl / ActivePerl-5.8.4.810-MSWin32-x86.exe / ActivePerl-5.8.4.810 / Perl / lib / Socket.pm < prev    next >
Text File  |  2004-06-01  |  10KB  |  402 lines

  1. package Socket;
  2.  
  3. our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
  4. $VERSION = "1.77";
  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
  215.     AF_OSI
  216.     AF_OSINET
  217.     AF_PUP
  218.     AF_ROUTE
  219.     AF_SNA
  220.     AF_UNIX
  221.     AF_UNSPEC
  222.     AF_USER
  223.     AF_WAN
  224.     AF_X25
  225.     IOV_MAX
  226.     MSG_BCAST
  227.     MSG_BTAG
  228.     MSG_CTLFLAGS
  229.     MSG_CTLIGNORE
  230.     MSG_CTRUNC
  231.     MSG_DONTROUTE
  232.     MSG_DONTWAIT
  233.     MSG_EOF
  234.     MSG_EOR
  235.     MSG_ERRQUEUE
  236.     MSG_ETAG
  237.     MSG_FIN
  238.     MSG_MAXIOVLEN
  239.     MSG_MCAST
  240.     MSG_NOSIGNAL
  241.     MSG_OOB
  242.     MSG_PEEK
  243.     MSG_PROXY
  244.     MSG_RST
  245.     MSG_SYN
  246.     MSG_TRUNC
  247.     MSG_URG
  248.     MSG_WAITALL
  249.     MSG_WIRE
  250.     PF_802
  251.     PF_AAL
  252.     PF_APPLETALK
  253.     PF_CCITT
  254.     PF_CHAOS
  255.     PF_CTF
  256.     PF_DATAKIT
  257.     PF_DECnet
  258.     PF_DLI
  259.     PF_ECMA
  260.     PF_GOSIP
  261.     PF_HYLINK
  262.     PF_IMPLINK
  263.     PF_INET
  264.     PF_INET6
  265.     PF_ISO
  266.     PF_KEY
  267.     PF_LAST
  268.     PF_LAT
  269.     PF_LINK
  270.     PF_MAX
  271.     PF_NBS
  272.     PF_NIT
  273.     PF_NS
  274.     PF_OSI
  275.     PF_OSINET
  276.     PF_PUP
  277.     PF_ROUTE
  278.     PF_SNA
  279.     PF_UNIX
  280.     PF_UNSPEC
  281.     PF_USER
  282.     PF_WAN
  283.     PF_X25
  284.     SCM_CONNECT
  285.     SCM_CREDENTIALS
  286.     SCM_CREDS
  287.     SCM_RIGHTS
  288.     SCM_TIMESTAMP
  289.     SHUT_RD
  290.     SHUT_RDWR
  291.     SHUT_WR
  292.     SOCK_DGRAM
  293.     SOCK_RAW
  294.     SOCK_RDM
  295.     SOCK_SEQPACKET
  296.     SOCK_STREAM
  297.     SOL_SOCKET
  298.     SOMAXCONN
  299.     SO_ACCEPTCONN
  300.     SO_ATTACH_FILTER
  301.     SO_BACKLOG
  302.     SO_BROADCAST
  303.     SO_CHAMELEON
  304.     SO_DEBUG
  305.     SO_DETACH_FILTER
  306.     SO_DGRAM_ERRIND
  307.     SO_DONTLINGER
  308.     SO_DONTROUTE
  309.     SO_ERROR
  310.     SO_FAMILY
  311.     SO_KEEPALIVE
  312.     SO_LINGER
  313.     SO_OOBINLINE
  314.     SO_PASSCRED
  315.     SO_PASSIFNAME
  316.     SO_PEERCRED
  317.     SO_PROTOCOL
  318.     SO_PROTOTYPE
  319.     SO_RCVBUF
  320.     SO_RCVLOWAT
  321.     SO_RCVTIMEO
  322.     SO_REUSEADDR
  323.     SO_REUSEPORT
  324.     SO_SECURITY_AUTHENTICATION
  325.     SO_SECURITY_ENCRYPTION_NETWORK
  326.     SO_SECURITY_ENCRYPTION_TRANSPORT
  327.     SO_SNDBUF
  328.     SO_SNDLOWAT
  329.     SO_SNDTIMEO
  330.     SO_STATE
  331.     SO_TYPE
  332.     SO_USELOOPBACK
  333.     SO_XOPEN
  334.     SO_XSE
  335.     UIO_MAXIOV
  336. );
  337.  
  338. @EXPORT_OK = qw(CR LF CRLF $CR $LF $CRLF
  339.  
  340.            IPPROTO_TCP
  341.            TCP_KEEPALIVE
  342.            TCP_MAXRT
  343.            TCP_MAXSEG
  344.            TCP_NODELAY
  345.            TCP_STDURG);
  346.  
  347. %EXPORT_TAGS = (
  348.     crlf    => [qw(CR LF CRLF $CR $LF $CRLF)],
  349.     all     => [@EXPORT, @EXPORT_OK],
  350. );
  351.  
  352. BEGIN {
  353.     sub CR   () {"\015"}
  354.     sub LF   () {"\012"}
  355.     sub CRLF () {"\015\012"}
  356. }
  357.  
  358. *CR   = \CR();
  359. *LF   = \LF();
  360. *CRLF = \CRLF();
  361.  
  362. sub sockaddr_in {
  363.     if (@_ == 6 && !wantarray) { # perl5.001m compat; use this && die
  364.     my($af, $port, @quad) = @_;
  365.     warnings::warn "6-ARG sockaddr_in call is deprecated" 
  366.         if warnings::enabled();
  367.     pack_sockaddr_in($port, inet_aton(join('.', @quad)));
  368.     } elsif (wantarray) {
  369.     croak "usage:   (port,iaddr) = sockaddr_in(sin_sv)" unless @_ == 1;
  370.         unpack_sockaddr_in(@_);
  371.     } else {
  372.     croak "usage:   sin_sv = sockaddr_in(port,iaddr))" unless @_ == 2;
  373.         pack_sockaddr_in(@_);
  374.     }
  375. }
  376.  
  377. sub sockaddr_un {
  378.     if (wantarray) {
  379.     croak "usage:   (filename) = sockaddr_un(sun_sv)" unless @_ == 1;
  380.         unpack_sockaddr_un(@_);
  381.     } else {
  382.     croak "usage:   sun_sv = sockaddr_un(filename)" unless @_ == 1;
  383.         pack_sockaddr_un(@_);
  384.     }
  385. }
  386.  
  387. sub AUTOLOAD {
  388.     my($constname);
  389.     ($constname = $AUTOLOAD) =~ s/.*:://;
  390.     croak "&Socket::constant not defined" if $constname eq 'constant';
  391.     my ($error, $val) = constant($constname);
  392.     if ($error) {
  393.     croak $error;
  394.     }
  395.     *$AUTOLOAD = sub { $val };
  396.     goto &$AUTOLOAD;
  397. }
  398.  
  399. XSLoader::load 'Socket', $VERSION;
  400.  
  401. 1;
  402.