Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > 70ec89744a04da80369b4702b2c37256 > files > 1494

ghc-doc-6.10.4-1mdv2010.0.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--Rendered using the Haskell Html Library v0.2-->
<HTML
><HEAD
><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"
><TITLE
>Network</TITLE
><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css"
><SCRIPT SRC="haddock-util.js" TYPE="text/javascript"
></SCRIPT
><SCRIPT TYPE="text/javascript"
>window.onload = function () {setSynopsis("mini_Network.html")};</SCRIPT
></HEAD
><BODY
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="topbar"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD
><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" "
></TD
><TD CLASS="title"
>network-2.2.1.2: Networking-related facilities</TD
><TD CLASS="topbut"
><A HREF="index.html"
>Contents</A
></TD
><TD CLASS="topbut"
><A HREF="doc-index.html"
>Index</A
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="modulebar"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD
><FONT SIZE="6"
>Network</FONT
></TD
><TD ALIGN="right"
><TABLE CLASS="narrow" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="infohead"
>Portability</TD
><TD CLASS="infoval"
>portable</TD
></TR
><TR
><TD CLASS="infohead"
>Stability</TD
><TD CLASS="infoval"
>provisional</TD
></TR
><TR
><TD CLASS="infohead"
>Maintainer</TD
><TD CLASS="infoval"
>libraries@haskell.org</TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="section4"
><B
>Contents</B
></TD
></TR
><TR
><TD
><DL
><DT
><A HREF="#1"
>Basic data types
</A
></DT
><DT
><A HREF="#2"
>Initialisation
</A
></DT
><DT
><A HREF="#3"
>Server-side connections
</A
></DT
><DT
><A HREF="#4"
>Client-side connections
</A
></DT
><DT
><A HREF="#5"
>Simple sending and receiving
</A
></DT
><DT
><A HREF="#6"
>Miscellaneous
</A
></DT
><DT
><A HREF="#7"
>Networking Issues
</A
></DT
><DD
><DL
><DT
><A HREF="#8"
>Buffering
</A
></DT
><DT
><A HREF="#9"
>Improving I/O Performance over sockets
</A
></DT
><DT
><A HREF="#10"
><TT
>SIGPIPE</TT
>
</A
></DT
></DL
></DD
></DL
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Description</TD
></TR
><TR
><TD CLASS="doc"
>The <A HREF="Network.html"
>Network</A
> interface is a &quot;higher-level&quot; interface to
 networking facilities, and it is recommended unless you need the
 lower-level interface in <A HREF="Network-Socket.html"
>Network.Socket</A
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Synopsis</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3ASocket"
>Socket</A
> </TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3APortID"
>PortID</A
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3AService"
>Service</A
> <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3APortNumber"
>PortNumber</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AUnixSocket"
>UnixSocket</A
> <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3AHostName"
>HostName</A
> = <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3APortNumber"
>PortNumber</A
> </TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AwithSocketsDo"
>withSocketsDo</A
> ::  <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> a -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> a</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AlistenOn"
>listenOn</A
> :: <A HREF="Network.html#t%3APortID"
>PortID</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="Network.html#t%3ASocket"
>Socket</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3Aaccept"
>accept</A
> :: <A HREF="Network.html#t%3ASocket"
>Socket</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> (<A HREF="../base/System-IO.html#t%3AHandle"
>Handle</A
>, <A HREF="Network.html#t%3AHostName"
>HostName</A
>, <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
>)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AsClose"
>sClose</A
> :: <A HREF="Network.html#t%3ASocket"
>Socket</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AconnectTo"
>connectTo</A
> :: <A HREF="Network.html#t%3AHostName"
>HostName</A
> -&gt; <A HREF="Network.html#t%3APortID"
>PortID</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="../base/System-IO.html#t%3AHandle"
>Handle</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AsendTo"
>sendTo</A
> :: <A HREF="Network.html#t%3AHostName"
>HostName</A
> -&gt; <A HREF="Network.html#t%3APortID"
>PortID</A
> -&gt; <A HREF="../base/Data-Char.html#t%3AString"
>String</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArecvFrom"
>recvFrom</A
> :: <A HREF="Network.html#t%3AHostName"
>HostName</A
> -&gt; <A HREF="Network.html#t%3APortID"
>PortID</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AsocketPort"
>socketPort</A
> :: <A HREF="Network.html#t%3ASocket"
>Socket</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="Network.html#t%3APortID"
>PortID</A
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="1"
><A NAME="1"
>Basic data types
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:Socket"
><A NAME="t%3ASocket"
></A
></A
><B
>Socket</B
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:Socket')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:Socket" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="../base/Data-Eq.html#t%3AEq"
>Eq</A
> <A HREF="Network.html#t%3ASocket"
>Socket</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Text-Show.html#t%3AShow"
>Show</A
> <A HREF="Network.html#t%3ASocket"
>Socket</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Data-Typeable.html#t%3ATypeable"
>Typeable</A
> <A HREF="Network.html#t%3ASocket"
>Socket</A
></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:PortID"
><A NAME="t%3APortID"
></A
></A
><B
>PortID</B
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:Service"
><A NAME="v%3AService"
></A
></A
><B
>Service</B
> <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:PortNumber"
><A NAME="v%3APortNumber"
></A
></A
><B
>PortNumber</B
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:UnixSocket"
><A NAME="v%3AUnixSocket"
></A
></A
><B
>UnixSocket</B
> <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
><TD CLASS="rdoc"
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:HostName"
><A NAME="t%3AHostName"
></A
></A
><B
>HostName</B
> = <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:PortNumber"
><A NAME="t%3APortNumber"
></A
></A
><B
>PortNumber</B
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:PortNumber')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:PortNumber" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="../base/Prelude.html#t%3AEnum"
>Enum</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Data-Eq.html#t%3AEq"
>Eq</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Prelude.html#t%3AIntegral"
>Integral</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Prelude.html#t%3ANum"
>Num</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Data-Ord.html#t%3AOrd"
>Ord</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Prelude.html#t%3AReal"
>Real</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Text-Show.html#t%3AShow"
>Show</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Data-Typeable.html#t%3ATypeable"
>Typeable</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Foreign-Storable.html#t%3AStorable"
>Storable</A
> <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="2"
><A NAME="2"
>Initialisation
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:withSocketsDo"
><A NAME="v%3AwithSocketsDo"
></A
></A
><B
>withSocketsDo</B
> ::  <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> a -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> a</TD
></TR
><TR
><TD CLASS="doc"
><P
>On Windows operating systems, the networking subsystem has to be
initialised using <TT
><A HREF="Network.html#v%3AwithSocketsDo"
>withSocketsDo</A
></TT
> before any networking operations can
be used.  eg.
</P
><PRE
> main = withSocketsDo $ do {...}
</PRE
><P
>Although this is only strictly necessary on Windows platforms, it is
harmless on other platforms, so for portability it is good practice to
use it all the time.
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="3"
><A NAME="3"
>Server-side connections
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:listenOn"
><A NAME="v%3AlistenOn"
></A
></A
><B
>listenOn</B
></TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="arg"
>:: <A HREF="Network.html#t%3APortID"
>PortID</A
></TD
><TD CLASS="rdoc"
>Port Identifier
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="Network.html#t%3ASocket"
>Socket</A
></TD
><TD CLASS="rdoc"
>Connected Socket
</TD
></TR
><TR
><TD CLASS="ndoc" COLSPAN="2"
><P
>Creates the server side socket which has been bound to the
 specified port.  
</P
><P
>NOTE: To avoid the &quot;Address already in use&quot;
 problems popped up several times on the GHC-Users mailing list we
 set the <TT
><A HREF="Network-Socket.html#v%3AReuseAddr"
>ReuseAddr</A
></TT
> socket option on the listening socket.  If you
 don't want this behaviour, please use the lower level
 <TT
><A HREF="Network-Socket.html#v%3Alisten"
>listen</A
></TT
> instead.
</P
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:accept"
><A NAME="v%3Aaccept"
></A
></A
><B
>accept</B
></TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="arg"
>:: <A HREF="Network.html#t%3ASocket"
>Socket</A
></TD
><TD CLASS="rdoc"
>Listening Socket
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> (<A HREF="../base/System-IO.html#t%3AHandle"
>Handle</A
>, <A HREF="Network.html#t%3AHostName"
>HostName</A
>, <A HREF="Network.html#t%3APortNumber"
>PortNumber</A
>)</TD
><TD CLASS="rdoc"
>Triple of: read/write <TT
><A HREF="../base/System-IO.html#t%3AHandle"
>Handle</A
></TT
> for 
 communicating with the client,
 the <TT
><A HREF="Network.html#t%3AHostName"
>HostName</A
></TT
> of the peer socket, and
 the <TT
><A HREF="Network.html#t%3APortNumber"
>PortNumber</A
></TT
> of the remote connection.
</TD
></TR
><TR
><TD CLASS="ndoc" COLSPAN="2"
>Accept a connection on a socket created by <TT
><A HREF="Network.html#v%3AlistenOn"
>listenOn</A
></TT
>.  Normal
 I/O operations (see <A HREF="System-IO.html"
>System.IO</A
>) can be used on the <TT
><A HREF="../base/System-IO.html#t%3AHandle"
>Handle</A
></TT
>
 returned to communicate with the client.
 Notice that although you can pass any Socket to Network.accept,
 only sockets of either AF_UNIX, AF_INET, or AF_INET6 will work
 (this shouldn't be a problem, though). When using AF_UNIX, HostName
 will be set to the path of the socket and PortNumber to -1.
</TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:sClose"
><A NAME="v%3AsClose"
></A
></A
><B
>sClose</B
> :: <A HREF="Network.html#t%3ASocket"
>Socket</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="doc"
>Closes a socket
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="4"
><A NAME="4"
>Client-side connections
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:connectTo"
><A NAME="v%3AconnectTo"
></A
></A
><B
>connectTo</B
> :: <A HREF="Network.html#t%3AHostName"
>HostName</A
> -&gt; <A HREF="Network.html#t%3APortID"
>PortID</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="../base/System-IO.html#t%3AHandle"
>Handle</A
></TD
></TR
><TR
><TD CLASS="doc"
>Calling <TT
><A HREF="Network.html#v%3AconnectTo"
>connectTo</A
></TT
> creates a client side socket which is
 connected to the given host and port.  The Protocol and socket type is
 derived from the given port identifier.  If a port number is given
 then the result is always an internet family <TT
><A HREF="Network-Socket.html#v%3AStream"
>Stream</A
></TT
> socket. 
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="5"
><A NAME="5"
>Simple sending and receiving
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="doc"
>Send and receive data from/to the given host and port number.  These
should normally only be used where the socket will not be required for
further calls. Also, note that due to the use of <TT
><A HREF="../base/System-IO.html#v%3AhGetContents"
>hGetContents</A
></TT
> in <TT
><A HREF="Network.html#v%3ArecvFrom"
>recvFrom</A
></TT
>
the socket will remain open (i.e. not available) even if the function already
returned. Their use is strongly discouraged except for small test-applications
or invocations from the command line.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:sendTo"
><A NAME="v%3AsendTo"
></A
></A
><B
>sendTo</B
> :: <A HREF="Network.html#t%3AHostName"
>HostName</A
> -&gt; <A HREF="Network.html#t%3APortID"
>PortID</A
> -&gt; <A HREF="../base/Data-Char.html#t%3AString"
>String</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:recvFrom"
><A NAME="v%3ArecvFrom"
></A
></A
><B
>recvFrom</B
> :: <A HREF="Network.html#t%3AHostName"
>HostName</A
> -&gt; <A HREF="Network.html#t%3APortID"
>PortID</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="6"
><A NAME="6"
>Miscellaneous
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:socketPort"
><A NAME="v%3AsocketPort"
></A
></A
><B
>socketPort</B
> :: <A HREF="Network.html#t%3ASocket"
>Socket</A
> -&gt; <A HREF="../base/System-IO.html#t%3AIO"
>IO</A
> <A HREF="Network.html#t%3APortID"
>PortID</A
></TD
></TR
><TR
><TD CLASS="doc"
>Returns the <TT
><A HREF="Network.html#t%3APortID"
>PortID</A
></TT
> associated with a given socket.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="7"
><A NAME="7"
>Networking Issues
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="8"
><A NAME="8"
>Buffering
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="doc"
><P
>The <TT
><A HREF="../base/System-IO.html#t%3AHandle"
>Handle</A
></TT
> returned by <TT
><A HREF="Network.html#v%3AconnectTo"
>connectTo</A
></TT
> and <TT
><A HREF="Network.html#v%3Aaccept"
>accept</A
></TT
> is block-buffered by
default.  For an interactive application you may want to set the
buffering mode on the <TT
><A HREF="../base/System-IO.html#t%3AHandle"
>Handle</A
></TT
> to
<TT
><A HREF="../base/System-IO.html#v%3ALineBuffering"
>LineBuffering</A
></TT
> or <TT
><A HREF="../base/System-IO.html#v%3ANoBuffering"
>NoBuffering</A
></TT
>, like so:
</P
><PRE
> h &lt;- connectTo host port
 hSetBuffering h LineBuffering
</PRE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="9"
><A NAME="9"
>Improving I/O Performance over sockets
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="doc"
>For really fast I/O, it might be worth looking at the <TT
><A HREF="../base/System-IO.html#v%3AhGetBuf"
>hGetBuf</A
></TT
> and
<TT
><A HREF="../base/System-IO.html#v%3AhPutBuf"
>hPutBuf</A
></TT
> family of functions in <A HREF="System-IO.html"
>System.IO</A
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="10"
><A NAME="10"
><TT
>SIGPIPE</TT
>
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="doc"
><P
>On Unix, when writing to a socket and the reading end is
closed by the remote client, the program is normally sent a
<TT
>SIGPIPE</TT
> signal by the operating system.  The
default behaviour when a <TT
>SIGPIPE</TT
> is received is
to terminate the program silently, which can be somewhat confusing
if you haven't encountered this before.  The solution is to
specify that <TT
>SIGPIPE</TT
> is to be ignored, using
the POSIX library:
</P
><PRE
>  import Posix
  main = do installHandler sigPIPE Ignore Nothing; ...
</PRE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="botbar"
>Produced by <A HREF="http://www.haskell.org/haddock/"
>Haddock</A
> version 2.4.2</TD
></TR
></TABLE
></BODY
></HTML
>