123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 |
- %
- % $Id$
- % This file is part of the FPC documentation.
- % Copyright (C) 1997, by Michael Van Canneyt
- %
- % The FPC documentation is free text; you can redistribute it and/or
- % modify it under the terms of the GNU Library General Public License as
- % published by the Free Software Foundation; either version 2 of the
- % License, or (at your option) any later version.
- %
- % The FPC Documentation is distributed in the hope that it will be useful,
- % but WITHOUT ANY WARRANTY; without even the implied warranty of
- % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- % Library General Public License for more details.
- %
- % You should have received a copy of the GNU Library General Public
- % License along with the FPC documentation; see the file COPYING.LIB. If not,
- % write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- % Boston, MA 02111-1307, USA.
- %
- \chapter{The SOCKETS unit.}
- \label{ch:socketsunit}
- \FPCexampledir{sockex}
- This chapter describes the SOCKETS unit for Free Pascal.
- it was written for \linux by Micha\"el Van Canneyt, and ported to \windows
- by Florian Kl\"ampfl.
- The chapter is divided in 2 sections:
- \begin{itemize}
- \item The first section lists types, constants and variables from the
- interface part of the unit.
- \item The second section describes the functions defined in the unit.
- \end{itemize}
- \section {Types, Constants and variables : }
- The following constants identify the different socket types, as needed in
- the \seef{Socket} call.
- \begin{verbatim}
- SOCK_STREAM = 1; { stream (connection) socket }
- SOCK_DGRAM = 2; { datagram (conn.less) socket }
- SOCK_RAW = 3; { raw socket }
- SOCK_RDM = 4; { reliably-delivered message }
- SOCK_SEQPACKET = 5; { sequential packet socket }
- SOCK_PACKET =10;
- \end{verbatim}
- The following constants determine the socket domain, they are used in the
- \seef{Socket} call.
- \begin{verbatim}
- AF_UNSPEC = 0;
- AF_UNIX = 1; { Unix domain sockets }
- AF_INET = 2; { Internet IP Protocol }
- AF_AX25 = 3; { Amateur Radio AX.25 }
- AF_IPX = 4; { Novell IPX }
- AF_APPLETALK = 5; { Appletalk DDP }
- AF_NETROM = 6; { Amateur radio NetROM }
- AF_BRIDGE = 7; { Multiprotocol bridge }
- AF_AAL5 = 8; { Reserved for Werner's ATM }
- AF_X25 = 9; { Reserved for X.25 project }
- AF_INET6 = 10; { IP version 6 }
- AF_MAX = 12;
- \end{verbatim}
- The following constants determine the protocol family, they are used in the
- \seef{Socket} call.
- \begin{verbatim}
- PF_UNSPEC = AF_UNSPEC;
- PF_UNIX = AF_UNIX;
- PF_INET = AF_INET;
- PF_AX25 = AF_AX25;
- PF_IPX = AF_IPX;
- PF_APPLETALK = AF_APPLETALK;
- PF_NETROM = AF_NETROM;
- PF_BRIDGE = AF_BRIDGE;
- PF_AAL5 = AF_AAL5;
- PF_X25 = AF_X25;
- PF_INET6 = AF_INET6;
- PF_MAX = AF_MAX;
- \end{verbatim}
- The following types are used to store different kinds of eddresses for the
- \seef{Bind}, \seef{Recv} and \seef{Send} calls.
- \begin{verbatim}
- TSockAddr = packed Record
- family:word;
- data :array [0..13] of char;
- end;
- TUnixSockAddr = packed Record
- family:word;
- path:array[0..108] of char;
- end;
- TInetSockAddr = packed Record
- family:Word;
- port :Word;
- addr :Cardinal;
- pad :array [1..8] of byte;
- end;
- \end{verbatim}
- The following type is returned by the \seef{SocketPair} call.
- \begin{verbatim}
- TSockArray = Array[1..2] of Longint;
- \end{verbatim}
- \section {Functions and Procedures}
- \begin{function}{Accept}
- \Declaration
- Function Accept (Sock:Longint;Var Addr;Var Addrlen:Longint) : Longint;
- \Description
- \var{Accept} accepts a connection from a socket \var{Sock}, which was
- listening for a connection. If a connection is accepted, a file descriptor
- is returned. On error \var{-1} is returned. The returned socket may NOT
- be used to accept more connections. The original socket remains open.
- The \var{Accept} call fills the address of the connecting entity in
- \var{Addr}, and sets its length in \var{Addrlen}. \var{Addr} should
- be pointing to enough space, and \var{Addrlen} should be set to the
- amount of space available, prior to the call.
- \Errors
- On error, \var{-1} is returned, and errors are reported in
- \var{SocketError}, and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \item[SYS\_EOPNOTSUPP] The socket type doesn't support the \var{Listen}
- operation.
- \item[SYS\_EFAULT] \var{Addr} points outside your address space.
- \item[SYS\_EWOULDBLOCK] The requested operation would block the process.
- \end{description}
- \SeeAlso
- \seef{Listen}, \seef{Connect}
- \end{function}
- \FPCexample{socksvr}
- \begin{functionl}{Accept}{AltAAccept}
- \Declaration
- Function Accept (Sock:longint;var addr:string;var SockIn,SockOut:text) : Boolean;
- \Description
- This is an alternate form of the \seef{Accept} command. It is equivalent
- to subsequently calling the regular \seef{Accept}
- function and the \seep{Sock2Text} function.
- The function returns \var{True} if successfull, \var{False} otherwise.
- \Errors
- The errors are those of \seef{Accept}.
- \SeeAlso
- \seef{Accept}
- \end{functionl}
- \begin{functionl}{Accept}{AltBAccept}
- \Declaration
- Function Accept (Sock:longint;var addr:string;var SockIn,SockOut:File) : Boolean;
- \Description
- This is an alternate form of the \seef{Accept} command.
- It is equivalent
- to subsequently calling the regular \seef{Accept} function and the
- \seep{Sock2File} function.
- The \var{Addr} parameter contains the name of the unix socket file to be
- opened.
- The function returns \var{True} if successfull, \var{False} otherwise.
- \Errors
- The errors are those of \seef{Accept}.
- \SeeAlso
- \seef{Accept}
- \end{functionl}
- \begin{functionl}{Accept}{AltCAccept}
- \Declaration
- Function Accept (Sock:longint;var addr:TInetSockAddr;var SockIn,SockOut:File) : Boolean;
- \Description
- This is an alternate form of the \seef{Accept} command.
- It is equivalent
- to subsequently calling the regular \seef{Accept} function and the
- \seep{Sock2File} function.
- The \var{Addr} parameter contains the parameters of the internet socket that
- should be opened.
- The function returns \var{True} if successfull, \var{False} otherwise.
- \Errors
- The errors are those of \seef{Accept}.
- \SeeAlso
- \seef{Accept}
- \end{functionl}
- \begin{function}{Bind}
- \Declaration
- Function Bind (Sock:Longint;Var Addr;AddrLen:Longint) : Boolean;
- \Description
- \var{Bind} binds the socket \var{Sock} to address \var{Addr}. \var{Addr}
- has length \var{Addrlen}.
- The function returns \var{True} if the call was succesful, \var{False} if
- not.
- \Errors
- Errors are returned in \var{SocketError} and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_EINVAL] The socket is already bound to an address,
- \item[SYS\_EACCESS] Address is protected and you don't have permission to
- open it.
- \end{description}
- More arrors can be found in the Unix man pages.
- \SeeAlso
- \seef{Socket}
- \end{function}
- \begin{functionl}{Bind}{AltBind}
- \Declaration
- Function Bind (Sock:longint;const addr:string) : boolean;
- \Description
- This is an alternate form of the \var{Bind} command.
- This form of the \var{Bind} command is equivalent to subsequently
- calling \seep{Str2UnixSockAddr} and the regular \seef{Bind} function.
- The function returns \var{True} if successfull, \var{False} otherwise.
- \Errors
- Errors are those of the regular \seef{Bind} command.
- \SeeAlso
- \seef{Bind}
- \end{functionl}
- \begin{function}{Connect}
- \Declaration
- Function Connect (Sock:Longint;Var Addr;Addrlen:Longint) : Longint;
- \Description
- \var{Connect} opens a connection to a peer, whose address is described by
- \var{Addr}. \var{AddrLen} contains the length of the address.
- The type of \var{Addr} depends on the kind of connection you're trying to
- make, but is generally one of \var{TSockAddr} or \var{TUnixSockAddr}.
- The \var{Connect} function returns a file descriptor if the call
- was successfull, \var{-1} in case of error.
- \Errors
- On error, \var{-1} is returned and errors are reported in
- \var{SocketError}.
- \SeeAlso
- \seef{Listen}, \seef{Bind},\seef{Accept}
- \end{function}
- \FPCexample{sockcli}
- \begin{functionl}{Connect}{AltAConnect}
- \Declaration
- Function Connect (Sock:longint;const addr:string;var SockIn,SockOut:text) : Boolean;
- \Description
- This is an alternate form of the \seef{Connect} command.
- It is equivalent to subsequently calling the regular \seef{Connect}
- function and the \seep{Sock2Text} function.
- The function returns \var{True} if successfull, \var{False} otherwise.
- \Errors
- The errors are those of \seef{Connect}.
- \SeeAlso
- \seef{Connect}
- \end{functionl}
- \begin{functionl}{Connect}{AltBConnect}
- \Declaration
- Function Connect (Sock:longint;const addr:string;var SockIn,SockOut:file) : Boolean;
- \Description
- This is an alternate form of the \seef{Connect} command. The parameter
- \var{addr} contains the name of the unix socket file to be opened.
- It is equivalent to subsequently calling the regular \seef{Connect}
- function and the \seep{Sock2File} function.
- The function returns \var{True} if successfull, \var{False} otherwise.
- \Errors
- The errors are those of \seef{Connect}.
- \SeeAlso
- \seef{Connect}
- \end{functionl}
- \begin{functionl}{Connect}{AltCConnect}
- \Declaration
- Function Connect (Sock:longint;const addr: TInetSockAddr;var SockIn,SockOut:file) : Boolean;
- \Description
- This is another alternate form of the \seef{Connect} command.
- It is equivalent
- to subsequently calling the regular \seef{Connect} function and the
- \seep{Sock2File} function. The \var{Addr} parameter contains the parameters
- of the internet socket to connect to.
- The function returns \var{True} if successfull, \var{False} otherwise.
- \Errors
- The errors are those of \seef{Connect}.
- \SeeAlso
- \seef{Connect}
- \end{functionl}
- \FPCexample{pfinger}
- \begin{function}{GetPeerName}
- \Declaration
- Function GetPeerName (Sock:Longint;Var Addr;Var Addrlen:Longint) : Longint;
- \Description
- \var{GetPeerName} returns the name of the entity connected to the
- specified socket \var{Sock}. The Socket must be connected for this call to
- work.
- \var{Addr} should point to enough space to store the name, the
- amount of space pointed to should be set in \var{Addrlen}.
- When the function returns succesfully, \var{Addr} will be filled with the
- name, and \var{Addrlen} will be set to the length of \var{Addr}.
- \Errors
- Errors are reported in \var{SocketError}, and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOBUFS] The system doesn't have enough buffers to perform the
- operation.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \item[SYS\_EFAULT] \var{Addr} points outside your address space.
- \item[SYS\_ENOTCONN] The socket isn't connected.
- \end{description}
- \SeeAlso
- \seef{Connect}, \seef{Socket}, \seem{connect}{2}
- \end{function}
- \begin{function}{GetSocketName}
- \Declaration
- Function GetSocketName (Sock:Longint;Var Addr;Var Addrlen:Longint) : Longint;
- \Description
- \var{GetSockName} returns the current name of the specified socket
- \var{Sock}. \var{Addr} should point to enough space to store the name, the
- amount of space pointed to should be set in \var{Addrlen}.
- When the function returns succesfully, \var{Addr} will be filled with the
- name, and \var{Addrlen} will be set to the length of \var{Addr}.
- \Errors
- Errors are reported in \var{SocketError}, and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOBUFS] The system doesn't have enough buffers to perform the
- operation.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \item[SYS\_EFAULT] \var{Addr} points outside your address space.
- \end{description}
- \SeeAlso
- \seef{Bind}
- \end{function}
- \begin{function}{GetSocketOptions}
- \Declaration
- Function GetSocketOptions (Sock,Level,OptName:Longint;Var OptVal;optlen:longint) : Longint;
- \Description
- \var{GetSocketOptions} gets the connection options for socket \var{Sock}.
- The socket may be obtained from different levels, indicated by \var{Level},
- which can be one of the following:
- \begin{description}
- \item[SOL\_SOCKET] From the socket itself.
- \item[XXX] set \var{Level} to \var{XXX}, the protocol number of the protocol
- which should interprete the option.
- \end{description}
- For more information on this call, refer to the unix manual page \seem{getsockopt}{2}.
- \Errors
- Errors are reported in \var{SocketError}, and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \item[SYS\_EFAULT] \var{OptVal} points outside your address space.
- \end{description}
- \SeeAlso
- \seef{GetSocketOptions}
- \end{function}
- \begin{function}{Listen}
- \Declaration
- Function Listen (Sock,MaxConnect:Longint) : Boolean;
- \Description
- \var{Listen} listens for up to \var{MaxConnect} connections from socket
- \var{Sock}. The socket \var{Sock} must be of type \var{SOCK\_STREAM} or
- \var{Sock\_SEQPACKET}.
- The function returns \var{True} if a connection was accepted, \var{False}
- if an error occurred.
- \Errors
- Errors are reported in \var{SocketError}, and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \item[SYS\_EOPNOTSUPP] The socket type doesn't support the \var{Listen}
- operation.
- \end{description}
- \SeeAlso
- \seef{Socket}, \seef{Bind}, \seef{Connect}
- \end{function}
- \begin{function}{Recv}
- \Declaration
- Function Recv (Sock:Longint;Var Addr;AddrLen,Flags:Longint) : Longint;
- \Description
- \var{Recv} reads at most \var{Addrlen} bytes from socket \var{Sock} into
- address \var{Addr}. The socket must be in a connected state.
- \var{Flags} can be one of the following:
- \begin{description}
- \item [1] : Process out-of band data.
- \item [4] : Bypass routing, use a direct interface.
- \item [??] : Wait for full request or report an error.
- \end{description}
- The functions returns the number of bytes actually read from the socket, or
- -1 if a detectable error occurred.
- \Errors
- Errors are reported in \var{SocketError}, and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOTCONN] The socket isn't connected.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \item[SYS\_EFAULT] The address is outside your address space.
- \item[SYS\_EMSGSIZE] The message cannot be sent atomically.
- \item[SYS\_EWOULDBLOCK] The requested operation would block the process.
- \item[SYS\_ENOBUFS] The system doesn't have enough free buffers available.
- \end{description}
- \SeeAlso
- \seef{Send}
- \end{function}
- \begin{function}{Send}
- \Declaration
- Function Send (Sock:Longint;Var Addr;AddrLen,Flags:Longint) : Longint;
- \Description
- \var{Send} sends \var{AddrLen} bytes starting from address \var{Addr}
- to socket \var{Sock}. \var{Sock} must be in a connected state.
- The function returns the number of bytes sent, or -1 if a detectable
- error occurred.
- \var{Flags} can be one of the following:
- \begin{description}
- \item [1] : Process out-of band data.
- \item [4] : Bypass routing, use a direct interface.
- \end{description}
- \Errors
- Errors are reported in \var{SocketError}, and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \item[SYS\_EFAULT] The address is outside your address space.
- \item[SYS\_EMSGSIZE] The message cannot be sent atomically.
- \item[SYS\_EWOULDBLOCK] The requested operation would block the process.
- \item[SYS\_ENOBUFS] The system doesn't have enough free buffers available.
- \end{description}
- \SeeAlso
- \seef{Recv}, \seem{send}{2}
- \end{function}
- \begin{function}{SetSocketOptions}
- \Declaration
- Function SetSocketOptions (Sock,Level,OptName:Longint;Var OptVal;optlen:longint) : Longint;
- \Description
- \var{SetSocketOptions} sets the connection options for socket \var{Sock}.
- The socket may be manipulated at different levels, indicated by \var{Level},
- which can be one of the following:
- \begin{description}
- \item[SOL\_SOCKET] To manipulate the socket itself.
- \item[XXX] set \var{Level} to \var{XXX}, the protocol number of the protocol
- which should interprete the option.
- \end{description}
- For more information on this call, refer to the unix manual page \seem{setsockopt}{2}.
- \Errors
- Errors are reported in \var{SocketError}, and include the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \item[SYS\_EFAULT] \var{OptVal} points outside your address space.
- \end{description}
- \SeeAlso
- \seef{GetSocketOptions}
- \end{function}
- \begin{function}{Shutdown}
- \Declaration
- Function Shutdown (Sock:Longint;How:Longint) : Longint;
- \Description
- \var{ShutDown} closes one end of a full duplex socket connection, described
- by \var{Sock}. \var{How} determines how the connection will be shut down,
- and can be one of the following:
- \begin{description}
- \item[0] : Further receives are disallowed.
- \item[1] : Further sends are disallowed.
- \item[2] : Sending nor receiving are allowed.
- \end{description}
- On succes, the function returns 0, on error -1 is returned.
- \Errors
- \var{SocketError} is used to report errors, and includes the following:
- \begin{description}
- \item[SYS\_EBADF] The socket descriptor is invalid.
- \item[SYS\_ENOTCONN] The socket isn't connected.
- \item[SYS\_ENOTSOCK] The descriptor is not a socket.
- \end{description}
- \SeeAlso
- \seef{Socket}, \seef{Connect}
- \end{function}
- \begin{procedure}{Sock2File}
- \Declaration
- Procedure Sock2File (Sock:Longint;Var SockIn,SockOut:File);
- \Description
- \var{Sock2File} transforms a socket \var{Sock} into 2 Pascal file
- descriptors of type \var{File}, one for reading from the socket
- (\var{SockIn}), one for writing to the socket (\var{SockOut}).
- \Errors
- None.
- \SeeAlso
- \seef{Socket}, \seep{Sock2Text}
- \end{procedure}
- \begin{procedure}{Sock2Text}
- \Declaration
- Procedure Sock2Text (Sock:Longint;Var SockIn,SockOut: Text);
- \Description
- \var{Sock2Text} transforms a socket \var{Sock} into 2 Pascal file
- descriptors of type \var{Text}, one for reading from the socket
- (\var{SockIn}), one for writing to the socket (\var{SockOut}).
- \Errors
- None.
- \SeeAlso
- \seef{Socket}, \seep{Sock2File}
- \end{procedure}
- \begin{function}{Socket}
- \Declaration
- Function Socket (Domain,SocketType,Protocol:Longint) : Longint;
- \Description
- \var{Socket} creates a new socket in domain \var{Domain}, from type
- \var{SocketType} using protocol \var{Protocol}.
- The Domain, Socket type and Protocol can be specified using predefined
- constants (see the section on constants for available constants)
- If succesfull, the function returns a socket descriptor, which can be passed
- to a subsequent \seef{Bind} call. If unsuccesfull, the function returns -1.
- \Errors
- Errors are returned in \var{SocketError}, and include the follwing:
- \begin{description}
- \item[SYS\_EPROTONOSUPPORT]
- The protocol type or the specified protocol is not
- supported within this domain.
- \item[SYS\_EMFILE]
- The per-process descriptor table is full.
- \item[SYS\_ENFILE]
- The system file table is full.
- \item[SYS\_EACCESS]
- Permission to create a socket of the specified
- type and/or protocol is denied.
- \item[SYS\_ENOBUFS]
- Insufficient buffer space is available. The
- socket cannot be created until sufficient
- resources are freed.
- \end{description}
- \SeeAlso
- \seef{SocketPair}, \seem{socket}{2}
- \end{function}
- for an example, see \seef{Accept}.
- \begin{function}{SocketPair}
- \Declaration
- Function SocketPair (Domain,SocketType,Protocol:Longint;var Pair:TSockArray) : Longint;
- \Description
- \var{SocketPair} creates 2 sockets in domain \var{Domain}, from type
- \var{SocketType} and using protocol \var{Protocol}.
- The pair is returned in \var{Pair}, and they are indistinguishable.
- The function returns -1 upon error and 0 upon success.
- \Errors
- Errors are reported in \var{SocketError}, and are the same as in \seef{Socket}
- \SeeAlso
- \seep{Str2UnixSockAddr}
- \end{function}
- \begin{procedure}{Str2UnixSockAddr}
- \Declaration
- Procedure Str2UnixSockAddr(const addr:string;var t:TUnixSockAddr;var len:longint)
- \Description
- \var{Str2UnixSockAddr} transforms a Unix socket address in a string to a
- \var{TUnixSockAddr} structure which can be passed to the \seef{Bind} call.
- \Errors
- None.
- \SeeAlso
- \seef{Socket}, \seef{Bind}
- \end{procedure}
|