19 lines
51 KiB
HTML
19 lines
51 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>7 Examples</title><link rel="stylesheet" type="text/css" href="scribble.css" title="default" /><link rel="stylesheet" type="text/css" href="racket.css" title="default" /><link rel="stylesheet" type="text/css" href="scribble-style.css" title="default" /><script type="text/javascript" src="scribble-common.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="scribble-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist" style="margin-bottom: 1em;"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_0");">▼</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">Marketplace:<span class="mywbr"> </span> Network-<wbr></wbr>Aware Programming</a></td></tr></table></div><div class="tocviewsublisttop" style="display: block;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1 </td><td><a href="Concepts.html" class="tocviewlink" data-pltdoc="x">Concepts</a></td></tr><tr><td align="right">2 </td><td><a href="high-level-interface.html" class="tocviewlink" data-pltdoc="x">High-<wbr></wbr>level interface</a></td></tr><tr><td align="right">3 </td><td><a href="low-level-interface.html" class="tocviewlink" data-pltdoc="x">Low-<wbr></wbr>level interface</a></td></tr><tr><td align="right">4 </td><td><a href="Drivers.html" class="tocviewlink" data-pltdoc="x">Drivers</a></td></tr><tr><td align="right">5 </td><td><a href="writing-new-drivers.html" class="tocviewlink" data-pltdoc="x">Writing New Drivers</a></td></tr><tr><td align="right">6 </td><td><a href="Management_and_Monitoring.html" class="tocviewlink" data-pltdoc="x">Management and Monitoring</a></td></tr><tr><td align="right">7 </td><td><a href="" class="tocviewselflink" data-pltdoc="x">Examples</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_1");">►</a></td><td>7 </td><td><a href="" class="tocviewselflink" data-pltdoc="x">Examples</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">7.1 </td><td><a href="#%28part._echo-server-example%29" class="tocviewlink" data-pltdoc="x">TCP echo server</a></td></tr><tr><td align="right">7.2 </td><td><a href="#%28part._chat-server-example%29" class="tocviewlink" data-pltdoc="x">TCP chat server</a></td></tr><tr><td align="right">7.3 </td><td><a href="#%28part._chat-client-example%29" class="tocviewlink" data-pltdoc="x">TCP chat client</a></td></tr></table></div></div></div><div class="tocsub"><div class="tocsubtitle">On this page:</div><table class="tocsublist" cellspacing="0"><tr><td><span class="tocsublinknumber">7.1<tt> </tt></span><a href="#(part._echo-server-example)" class="tocsubseclink" data-pltdoc="x">TCP echo server</a></td></tr><tr><td><span class="tocsublinknumber">7.2<tt> </tt></span><a href="#(part._chat-server-example)" class="tocsubseclink" data-pltdoc="x">TCP chat server</a></td></tr><tr><td><span class="tocsublinknumber">7.3<tt> </tt></span><a href="#(part._chat-client-example)" class="tocsubseclink" data-pltdoc="x">TCP chat client</a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="versionbox"><span class="version">5.3.4.10</span></div><div class="navsettop"><span class="navleft"> </span><span class="navright"> <a href="Management_and_Monitoring.html" title="backward to "6 Management and Monitoring"" data-pltdoc="x">← prev</a> <a href="index.html" title="up to "Marketplace: Network-Aware Programming"" data-pltdoc="x">up</a> <span class="nonavigation">next →</span></span> </div><h3>7<tt> </tt><a name="(part._.Examples)"></a>Examples</h3><h4>7.1<tt> </tt><a name="(part._echo-server-example)"></a>TCP echo server</h4><p>Here is a complete Marketplace program:</p><blockquote class="SCodeFlow"><blockquote class="Rfilebox"><p class="Rfiletitle"><span class="Rfilename"><span class="stt">"examples/echo-paper.rkt"</span></span></p><blockquote class="Rfilecontent"><table cellspacing="0" class="RktBlk"><tr><td><a href="http://docs.racket-lang.org/guide/Module_Syntax.html#%28part._hash-lang%29" class="RktModLink" data-pltdoc="x"><span class="RktMod">#lang</span></a><span class="hspace"> </span><a href="low-level-interface.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace</span></a></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">?</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-listener</span><span class="hspace"> </span><span class="RktVal">5999</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:conversation</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">from</span><span class="hspace"> </span><span class="RktSym">to</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-presence</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">spawn</span><span class="hspace"> </span><span class="RktPn">#:child</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">echoer</span><span class="hspace"> </span><span class="RktSym">from</span><span class="hspace"> </span><span class="RktSym">to</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">echoer</span><span class="hspace"> </span><span class="RktSym">from</span><span class="hspace"> </span><span class="RktSym">to</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">transition</span><span class="hspace"> </span><span class="RktSym">stateless</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">from</span><span class="hspace"> </span><span class="RktSym">to</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-absence</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">quit</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktSym">data</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">to</span><span class="hspace"> </span><span class="RktSym">from</span><span class="hspace"> </span><span class="RktSym">data</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote></blockquote></blockquote><p>The top-level <span class="RktSym">endpoint</span> action subscribes to TCP connections
|
|
arriving on port 5999, and <span class="RktSym">spawn</span>s a fresh process in response to
|
|
each (<span class="RktPn">#:on-presence</span>). The topic of
|
|
conversation (<span class="RktPn">#:conversation</span>) associated with the newly-present
|
|
subscription is analyzed to give the remote
|
|
(<span class="RktSym">from</span>) and local (<span class="RktSym">to</span>) TCP addresses, which are
|
|
passed to the <span class="RktSym">echoer</span> function to give the initial actions for
|
|
the corresponding process. Here, the process is stateless, using the
|
|
special constant <span class="RktSym">stateless</span> as its state.</p><p>Each connection’s process creates an endpoint subscribing to data
|
|
arriving on its particular connection, using <span class="RktSym">from</span> and <span class="RktSym">to</span>
|
|
passed in from the top-level <span class="RktSym">endpoint</span>. When data arrives, it is
|
|
echoed back to the remote peer using <span class="RktSym">send-message</span>. Presence
|
|
manages disconnection; when the remote peer closes the TCP connection,
|
|
the <span class="RktPn">#:on-absence</span> handler in <span class="RktSym">echoer</span> issues a <span class="RktSym">quit</span>
|
|
action, terminating the connection’s process. The heart of our system
|
|
is the interface between a process and its containing VM. Our
|
|
implementation instantiates this interface as a collection of Typed
|
|
Racket programs.</p><h4>7.2<tt> </tt><a name="(part._chat-server-example)"></a>TCP chat server</h4><blockquote class="SCodeFlow"><blockquote class="Rfilebox"><p class="Rfiletitle"><span class="Rfilename"><span class="stt">"examples/chat-paper.rkt"</span></span></p><blockquote class="Rfilecontent"><table cellspacing="0" class="RktBlk"><tr><td><a href="http://docs.racket-lang.org/guide/Module_Syntax.html#%28part._hash-lang%29" class="RktModLink" data-pltdoc="x"><span class="RktMod">#lang</span></a><span class="hspace"> </span><a href="low-level-interface.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace</span></a></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">nested-vm</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">at-meta-level</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">?</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-listener</span><span class="hspace"> </span><span class="RktVal">5999</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">#:observer</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:conversation</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">us</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-presence</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">spawn</span><span class="hspace"> </span><span class="RktPn">#:child</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">chat-session</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">us</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">chat-session</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">user</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/symbols.html#%28def._%28%28quote._~23~25kernel%29._gensym%29%29" class="RktValLink" data-pltdoc="x">gensym</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">user</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">transition</span><span class="hspace"> </span><span class="RktSym">stateless</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">listen-to-user</span><span class="hspace"> </span><span class="RktSym">user</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">speak-to-user</span><span class="hspace"> </span><span class="RktSym">user</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">us</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">listen-to-user</span><span class="hspace"> </span><span class="RktSym">user</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:publisher</span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktRdr">,</span><span class="RktSym">user</span><span class="hspace"> </span><span class="RktVal">says</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">?</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">at-meta-level</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">us</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-absence</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">quit</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">?</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/bytestrings.html#%28def._%28%28quote._~23~25kernel%29._bytes~3f%29%29" class="RktValLink" data-pltdoc="x">bytes?</a></span><span class="hspace"> </span><span class="RktSym">text</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktRdr">,</span><span class="RktSym">user</span><span class="hspace"> </span><span class="RktVal">says</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">text</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">speak-to-user</span><span class="hspace"> </span><span class="RktSym">user</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">say</span><span class="hspace"> </span><span class="RktSym">fmt</span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktSym">args</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">at-meta-level</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">us</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/procedures.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._apply%29%29" class="RktValLink" data-pltdoc="x">apply</a></span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace"> </span><span class="RktSym">fmt</span><span class="hspace"> </span><span class="RktSym">args</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">announce</span><span class="hspace"> </span><span class="RktSym">who</span><span class="hspace"> </span><span class="RktSym">did-what</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/when_unless.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._unless%29%29" class="RktStxLink" data-pltdoc="x">unless</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/booleans.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span><span class="hspace"> </span><span class="RktSym">who</span><span class="hspace"> </span><span class="RktSym">user</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">say</span><span class="hspace"> </span><span class="RktVal">"~s ~s.~n"</span><span class="hspace"> </span><span class="RktSym">who</span><span class="hspace"> </span><span class="RktSym">did-what</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">say</span><span class="hspace"> </span><span class="RktVal">"You are ~s.~n"</span><span class="hspace"> </span><span class="RktSym">user</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">at-meta-level</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:publisher</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">us</span><span class="hspace"> </span><span class="RktSym">them</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktRdr">,</span><span class="RktSym">?</span><span class="hspace"> </span><span class="RktVal">says</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">?</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:conversation</span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktRdr">,</span><span class="RktSym">who</span><span class="hspace"> </span><span class="RktVal">says</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-presence</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">announce</span><span class="hspace"> </span><span class="RktSym">who</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">arrived</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-absence</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">announce</span><span class="hspace"> </span><span class="RktSym">who</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">departed</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktRdr">,</span><span class="RktSym">who</span><span class="hspace"> </span><span class="RktVal">says</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">what</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">say</span><span class="hspace"> </span><span class="RktVal">"~a: ~a"</span><span class="hspace"> </span><span class="RktSym">who</span><span class="hspace"> </span><span class="RktSym">what</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote></blockquote></blockquote><h4>7.3<tt> </tt><a name="(part._chat-client-example)"></a>TCP chat client</h4><blockquote class="SCodeFlow"><blockquote class="Rfilebox"><p class="Rfiletitle"><span class="Rfilename"><span class="stt">"examples/chat-client.rkt"</span></span></p><blockquote class="Rfilecontent"><table cellspacing="0" class="RktBlk"><tr><td><a href="http://docs.racket-lang.org/guide/Module_Syntax.html#%28part._hash-lang%29" class="RktModLink" data-pltdoc="x"><span class="RktMod">#lang</span></a><span class="hspace"> </span><a href="low-level-interface.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace</span></a></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._require%29%29" class="RktStxLink" data-pltdoc="x">require</a></span><span class="hspace"> </span><span class="RktSym">racket/port</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">spawn</span><span class="hspace"> </span><span class="RktPn">#:debug-name</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-output-driver</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:child</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">transition/no-state</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-output</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-output</span><span class="hspace"> </span><span class="RktSym">item</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/begin.html#%28form._%28%28quote._~23~25kernel%29._begin%29%29" class="RktStxLink" data-pltdoc="x">begin</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace"> </span><span class="RktVal">"~a"</span><span class="hspace"> </span><span class="RktSym">item</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void%29%29" class="RktValLink" data-pltdoc="x">void</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">spawn</span><span class="hspace"> </span><span class="RktPn">#:debug-name</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-input-driver</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:child</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">transition/no-state</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:publisher</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-input</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:name</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">input-relay</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-absence</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-output</span><span class="hspace"> </span><span class="RktVal">"Connection terminated.\n"</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">quit</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">read-line-evt</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/port-ops.html#%28def._%28%28quote._~23~25kernel%29._current-input-port%29%29" class="RktValLink" data-pltdoc="x">current-input-port</a></span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">any</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">?</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/port-ops.html#%28def._%28%28quote._~23~25kernel%29._eof-object~3f%29%29" class="RktValLink" data-pltdoc="x">eof-object?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-output</span><span class="hspace"> </span><span class="RktVal">"Terminating on local EOF.\n"</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">delete-endpoint</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">input-relay</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span></td></tr><tr><td><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">?</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="hspace"> </span><span class="RktSym">line</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-input</span><span class="hspace"> </span><span class="RktSym">line</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">spawn</span><span class="hspace"> </span><span class="RktPn">#:debug-name</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">outbound-connection</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:child</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/let.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._let%29%29" class="RktStxLink" data-pltdoc="x">let</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym">local</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-handle</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">outbound</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">remote</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-address</span><span class="hspace"> </span><span class="RktVal">"localhost"</span><span class="hspace"> </span><span class="RktVal">5999</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">transition/no-state</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-input</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-absence</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">quit</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-input</span><span class="hspace"> </span><span class="RktSym">line</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-output</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace"> </span><span class="RktVal">"> ~a \n"</span><span class="hspace"> </span><span class="RktSym">line</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">local</span><span class="hspace"> </span><span class="RktSym">remote</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/strings.html#%28def._%28%28quote._~23~25kernel%29._string-append%29%29" class="RktValLink" data-pltdoc="x">string-append</a></span><span class="hspace"> </span><span class="RktSym">line</span><span class="hspace"> </span><span class="RktVal">"\n"</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:publisher</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">local</span><span class="hspace"> </span><span class="RktSym">remote</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">endpoint</span><span class="hspace"> </span><span class="RktPn">#:subscriber</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym">remote</span><span class="hspace"> </span><span class="RktSym">local</span><span class="hspace"> </span><span class="RktSym">?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:on-absence</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">quit</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">?</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/port-ops.html#%28def._%28%28quote._~23~25kernel%29._eof-object~3f%29%29" class="RktValLink" data-pltdoc="x">eof-object?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">quit</span><span class="RktPn">)</span><span class="RktPn">]</span></td></tr><tr><td><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktSym">data</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">send-message</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">console-output</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace"> </span><span class="RktVal">"< ~a"</span><span class="hspace"> </span><span class="RktSym">data</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void%29%29" class="RktValLink" data-pltdoc="x">void</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote></blockquote></blockquote><div class="navsetbottom"><span class="navleft"> </span><span class="navright"> <a href="Management_and_Monitoring.html" title="backward to "6 Management and Monitoring"" data-pltdoc="x">← prev</a> <a href="index.html" title="up to "Marketplace: Network-Aware Programming"" data-pltdoc="x">up</a> <span class="nonavigation">next →</span></span> </div></div></div><div id="contextindicator"> </div></body></html> |