\section{Built-in Module \sectcode{socket}}

\bimodindex{socket}
This module provides access to the BSD {\em socket} interface.
It is available on \UNIX{} systems that support this interface.

For an introduction to socket programming (in C), see the following
papers: \emph{An Introductory 4.3BSD Interprocess Communication
Tutorial}, by Stuart Sechrest and \emph{An Advanced 4.3BSD Interprocess
Communication Tutorial}, by Samuel J.  Leffler et al, both in the
\UNIX{} Programmer's Manual, Supplementary Documents 1 (sections PS1:7
and PS1:8).  The \UNIX{} manual pages for the various socket-related
system calls also a valuable source of information on the details of
socket semantics.

The Python interface is a straightforward transliteration of the
\UNIX{} system call and library interface for sockets to Python's
object-oriented style: the \code{socket()} function returns a
\dfn{socket object} whose methods implement the various socket system
calls.  Parameter types are somewhat higer-level than in the C
interface: as with \code{read()} and \code{write()} operations on Python
files, buffer allocation on receive operations is automatic, and
buffer length is implicit on send operations.

Socket addresses are represented as a single string for the
\code{AF_UNIX} address family and as a pair
\code{(\var{host}, \var{port})} for the \code{AF_INET} address family,
where \var{host} is a string representing
either a hostname in Internet domain notation like
\code{'daring.cwi.nl'} or an IP address like \code{'100.50.200.5'},
and \var{port} is an integral port number.  Other address families are
currently not supported.  The address format required by a particular
socket object is automatically selected based on the address family
specified when the socket object was created.

All errors raise exceptions.  The normal exceptions for invalid
argument types and out-of-memory conditions can be raised; errors
related to socket or address semantics raise the error \code{socket.error}.

Non-blocking and asynchronous mode are not supported; see module
\code{select} for a way to do non-blocking socket I/O.

The module \code{socket} exports the following constants and functions:

\renewcommand{\indexsubitem}{(in module socket)}
\begin{excdesc}{error}
This exception is raised for socket- or address-related errors.
The accompanying value is either a string telling what went wrong or a
pair \code{(\var{errno}, \var{string})}
representing an error returned by a system
call, similar to the value accompanying \code{posix.error}.
\end{excdesc}

\begin{datadesc}{AF_UNIX}
\dataline{AF_INET}
These constants represent the address (and protocol) families,
used for the first argument to \code{socket()}.  If the \code{AF_UNIX}
constant is not defined then this protocol is unsupported.
\end{datadesc}

\begin{datadesc}{SOCK_STREAM}
\dataline{SOCK_DGRAM}
\dataline{SOCK_RAW}
\dataline{SOCK_RDM}
\dataline{SOCK_SEQPACKET}
These constants represent the socket types,
used for the second argument to \code{socket()}.
(Only \code{SOCK_STREAM} and
\code{SOCK_DGRAM} appear to be generally useful.)
\end{datadesc}

\begin{datadesc}{SO_*}
\dataline{SOMAXCONN}
\dataline{MSG_*}
\dataline{SOL_*}
\dataline{IPPROTO_*}
\dataline{IPPORT_*}
\dataline{INADDR_*}
\dataline{IP_*}
Many constants of these forms, documented in the Unix documentation on
sockets and/or the IP protocol, are also defined in the socket module.
They are generally used in arguments to the \code{setsockopt} and
\code{getsockopt} methods of socket objects.  In most cases, only
those symbols that are defined in the Unix header files are defined;
for a few symbols, default values are provided.
\end{datadesc}

\begin{funcdesc}{gethostbyname}{hostname}
Translate a host name to IP address format.  The IP address is
returned as a string, e.g.,  \code{'100.50.200.5'}.  If the host name
is an IP address itself it is returned unchanged.
\end{funcdesc}

\begin{funcdesc}{gethostname}{}
Return a string containing the hostname of the machine where 
the Python interpreter is currently executing.  If you want to know the
current machine's IP address, use
\code{socket.gethostbyname(socket.gethostname())} instead.
\end{funcdesc}

\begin{funcdesc}{gethostbyaddr}{ip_address}
Return a triple \code{(hostname, aliaslist, ipaddrlist)} where
\code{hostname} is the primary host name responding to the given
\var{ip_address}, \code{aliaslist} is a (possibly empty) list of
alternative host names for the same address, and \code{ipaddrlist} is
a list of IP addresses for the same interface on the same
host (most likely containing only a single address).
\end{funcdesc}

\begin{funcdesc}{getservbyname}{servicename\, protocolname}
Translate an Internet service name and protocol name to a port number
for that service.  The protocol name should be \code{'tcp'} or
\code{'udp'}.
\end{funcdesc}

\begin{funcdesc}{socket}{family\, type\, proto}
Create a new socket using the given address family, socket type and
protocol number.  The address family should be \code{AF_INET} or
\code{AF_UNIX}.  The socket type should be \code{SOCK_STREAM},
\code{SOCK_DGRAM} or perhaps one of the other \samp{SOCK_} constants.
The protocol number is usually zero and may be omitted in that case.
\end{funcdesc}

\begin{funcdesc}{fromfd}{fd\, family\, type\, proto}
Build a socket object from an existing file descriptor (an integer as
returned by a file object's \code{fileno} method).  Address family,
socket type and protocol number are as for the \code{socket} function
above.  The file descriptor should refer to a socket, but this is not
checked --- subsequent operations on the object may fail if the file
descriptor is invalid.  This function is rarely needed, but can be
used to get or set socket options on a socket passed to a program as
standard input or output (e.g. a server started by the \UNIX{} inet
daemon).
\end{funcdesc}

\subsection{Socket Object Methods}

\noindent
Socket objects have the following methods.  Except for
\code{makefile()} these correspond to \UNIX{} system calls applicable to
sockets.

\renewcommand{\indexsubitem}{(socket method)}
\begin{funcdesc}{accept}{}
Accept a connection.
The socket must be bound to an address and listening for connections.
The return value is a pair \code{(\var{conn}, \var{address})}
where \var{conn} is a \emph{new} socket object usable to send and
receive data on the connection, and \var{address} is the address bound
to the socket on the other end of the connection.
\end{funcdesc}

\begin{funcdesc}{bind}{address}
Bind the socket to \var{address}.  The socket must not already be bound.
(The format of \var{address} depends on the address family -- see above.)
\end{funcdesc}

\begin{funcdesc}{close}{}
Close the socket.  All future operations on the socket object will fail.
The remote end will receive no more data (after queued data is flushed).
Sockets are automatically closed when they are garbage-collected.
\end{funcdesc}

\begin{funcdesc}{connect}{address}
Connect to a remote socket at \var{address}.
(The format of \var{address} depends on the address family -- see above.)
\end{funcdesc}

\begin{funcdesc}{fileno}{}
Return the socket's file descriptor (a small integer).  This is useful
with \code{select}.
\end{funcdesc}

\begin{funcdesc}{getpeername}{}
Return the remote address to which the socket is connected.  This is
useful to find out the port number of a remote IP socket, for instance.
(The format of the address returned depends on the address family --
see above.)  On some systems this function is not supported.
\end{funcdesc}

\begin{funcdesc}{getsockname}{}
Return the socket's own address.  This is useful to find out the port
number of an IP socket, for instance.
(The format of the address returned depends on the address family --
see above.)
\end{funcdesc}

\begin{funcdesc}{getsockopt}{level\, optname\, buflen}
Return the value of the given socket option (see the \UNIX{} man page
{\it getsockopt}(2)).  The needed symbolic constants are defined in module
SOCKET.  If the optional third argument is absent, an integer option
is assumed and its integer value is returned by the function.  If
\var{buflen} is present, it specifies the maximum length of the buffer used
to receive the option in, and this buffer is returned as a string.
It's up to the caller to decode the contents of the buffer (see the
optional built-in module \code{struct} for a way to decode C structures
encoded as strings).
\end{funcdesc}

\begin{funcdesc}{listen}{backlog}
Listen for connections made to the socket.
The argument specifies the maximum number of queued connections and
should be at least 1; the maximum value is system-dependent.
\end{funcdesc}

\begin{funcdesc}{makefile}{mode}
Return a \dfn{file object} associated with the socket.
(File objects were described earlier under Built-in Types.)
The file object references a \code{dup}ped version of the socket file
descriptor, so the file object and socket object may be closed or
garbage-collected independently.
\end{funcdesc}

\begin{funcdesc}{recv}{bufsize\, flags}
Receive data from the socket.  The return value is a string representing
the data received.  The maximum amount of data to be received
at once is specified by \var{bufsize}.  See the \UNIX{} manual page
for the meaning of the optional argument \var{flags}; it defaults to
zero.
\end{funcdesc}

\begin{funcdesc}{recvfrom}{bufsize}
Receive data from the socket.  The return value is a pair
\code{(\var{string}, \var{address})} where \var{string} is a string
representing the data received and \var{address} is the address of the
socket sending the data.
(The format of \var{address} depends on the address family -- see above.)
\end{funcdesc}

\begin{funcdesc}{send}{string}
Send data to the socket.  The socket must be connected to a remote
socket.  Return the number of bytes sent.
\end{funcdesc}

\begin{funcdesc}{sendto}{string\, address}
Send data to the socket.  The socket should not be connected to a
remote socket, since the destination socket is specified by
\code{address}.  Return the number of bytes sent.
(The format of \var{address} depends on the address family -- see above.)
\end{funcdesc}

\begin{funcdesc}{setblocking}{flag}
Set blocking or non-blocking mode of the socket: if \var{flag} is 0,
the socket is set to non-blocking, else to blocking mode.  Initially
all sockets are in blocking mode.  In non-blocking mode, if a
\code{recv} call doesn't find any data, or if a \code{send} call can't
immediately dispose of the data, a \code{socket.error} exception is
raised; in blocking mode, the calls block until they can proceed.
\end{funcdesc}

\begin{funcdesc}{setsockopt}{level\, optname\, value}
Set the value of the given socket option (see the \UNIX{} man page
{\it setsockopt}(2)).  The needed symbolic constants are defined in module
\code{SOCKET}.  The value can be an integer or a string representing a
buffer.  In the latter case it is up to the caller to ensure that the
string contains the proper bits (see the optional built-in module
\code{struct} for a way to encode C structures as strings).
\end{funcdesc}

\begin{funcdesc}{shutdown}{how}
Shut down one or both halves of the connection.  If \var{how} is \code{0},
further receives are disallowed.  If \var{how} is \code{1}, further sends are
disallowed.  If \var{how} is \code{2}, further sends and receives are
disallowed.
\end{funcdesc}

Note that there are no methods \code{read()} or \code{write()}; use
\code{recv()} and \code{send()} without \var{flags} argument instead.

\subsection{Example}
\nodename{Socket Example}

Here are two minimal example programs using the TCP/IP protocol: a
server that echoes all data that it receives back (servicing only one
client), and a client using it.  Note that a server must perform the
sequence \code{socket}, \code{bind}, \code{listen}, \code{accept}
(possibly repeating the \code{accept} to service more than one client),
while a client only needs the sequence \code{socket}, \code{connect}.
Also note that the server does not \code{send}/\code{receive} on the
socket it is listening on but on the new socket returned by
\code{accept}.

\bcode\begin{verbatim}
# Echo server program
from socket import *
HOST = ''                 # Symbolic name meaning the local host
PORT = 50007              # Arbitrary non-privileged server
s = socket(AF_INET, SOCK_STREAM)
s.bind(HOST, PORT)
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()
\end{verbatim}\ecode

\bcode\begin{verbatim}
# Echo client program
from socket import *
HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket(AF_INET, SOCK_STREAM)
s.connect(HOST, PORT)
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', `data`
\end{verbatim}\ecode
