marketplace-2014/Drivers.html

49 lines
52 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>4&nbsp;Drivers</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="manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="manual-racket.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 tocviewlisttopspace"><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,&quot;tocview_0&quot;);">&#9660;</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">Marketplace:<span class="mywbr"> &nbsp;</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&nbsp;</td><td><a href="Concepts.html" class="tocviewlink" data-pltdoc="x">Concepts</a></td></tr><tr><td align="right">2&nbsp;</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&nbsp;</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&nbsp;</td><td><a href="Drivers.html" class="tocviewselflink" data-pltdoc="x">Drivers</a></td></tr><tr><td align="right">5&nbsp;</td><td><a href="Management_and_Monitoring.html" class="tocviewlink" data-pltdoc="x">Management and Monitoring</a></td></tr><tr><td align="right">6&nbsp;</td><td><a href="Examples.html" class="tocviewlink" 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,&quot;tocview_1&quot;);">&#9658;</a></td><td>4&nbsp;</td><td><a href="Drivers.html" class="tocviewselflink" data-pltdoc="x">Drivers</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">4.1&nbsp;</td><td><a href="Drivers.html#%28part._event-relay%29" class="tocviewlink" data-pltdoc="x">event-<wbr></wbr>relay</a></td></tr><tr><td align="right">4.2&nbsp;</td><td><a href="Drivers.html#%28part._tcp-bare%29" class="tocviewlink" data-pltdoc="x">tcp-<wbr></wbr>bare</a></td></tr><tr><td align="right">4.3&nbsp;</td><td><a href="Drivers.html#%28part._timer__typed_and_untyped_%29" class="tocviewlink" data-pltdoc="x">timer (typed and untyped)</a></td></tr><tr><td align="right">4.4&nbsp;</td><td><a href="Drivers.html#%28part._udp__typed_and_untyped_%29" class="tocviewlink" data-pltdoc="x">udp (typed and untyped)</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">4.1<tt>&nbsp;</tt></span><a href="#%28part._event-relay%29" class="tocsubseclink" data-pltdoc="x">event-<wbr></wbr>relay</a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Fevent-relay..rkt%29._event-relay%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">event-<wbr></wbr>relay</span></span></a></td></tr><tr><td><span class="tocsublinknumber">4.2<tt>&nbsp;</tt></span><a href="#%28part._tcp-bare%29" class="tocsubseclink" data-pltdoc="x">tcp-<wbr></wbr>bare</a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-driver%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">tcp-<wbr></wbr>driver</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">tcp</span></span></a></td></tr><tr><td><span class="tocsublinknumber">4.2.1<tt>&nbsp;</tt></span><a href="#%28part._.T.C.P_channels%29" class="tocsubseclink" data-pltdoc="x">TCP channels</a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">tcp-<wbr></wbr>channel</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._.Tcp.Sub.Packet%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym">Tcp<span class="mywbr"> &nbsp;</span>Sub<span class="mywbr"> &nbsp;</span>Packet</span></a></td></tr><tr><td><span class="tocsublinknumber">4.2.2<tt>&nbsp;</tt></span><a href="#%28part._.T.C.P_addresses%29" class="tocsubseclink" data-pltdoc="x">TCP addresses</a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._.Tcp.Address%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym">Tcp<span class="mywbr"> &nbsp;</span>Address</span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-address%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">tcp-<wbr></wbr>address</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-handle%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">tcp-<wbr></wbr>handle</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-listener%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">tcp-<wbr></wbr>listener</span></span></a></td></tr><tr><td><span class="tocsublinknumber">4.2.3<tt>&nbsp;</tt></span><a href="#%28part._.Opening_an_outbound_connection%29" class="tocsubseclink" data-pltdoc="x">Opening an outbound connection</a></td></tr><tr><td><span class="tocsublinknumber">4.2.4<tt>&nbsp;</tt></span><a href="#%28part._.Accepting_inbound_connections%29" class="tocsubseclink" data-pltdoc="x">Accepting inbound connections</a></td></tr><tr><td><span class="tocsublinknumber">4.2.5<tt>&nbsp;</tt></span><a href="#%28part._.Receiving_data%29" class="tocsubseclink" data-pltdoc="x">Receiving data</a></td></tr><tr><td><span class="tocsublinknumber">4.2.6<tt>&nbsp;</tt></span><a href="#%28part._.Sending_data%29" class="tocsubseclink" data-pltdoc="x">Sending data</a></td></tr><tr><td><span class="tocsublinknumber">4.3<tt>&nbsp;</tt></span><a href="#%28part._timer__typed_and_untyped_%29" class="tocsubseclink" data-pltdoc="x">timer (typed and untyped)</a></td></tr><tr><td><span class="tocsublinknumber">4.4<tt>&nbsp;</tt></span><a href="#%28part._udp__typed_and_untyped_%29" class="tocsubseclink" data-pltdoc="x">udp (typed and untyped)</a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="versionbox"><span class="version">6.0.0.1</span></div><div class="navsettop"><span class="navleft">&nbsp;&nbsp;</span><span class="navright">&nbsp;&nbsp;<a href="low-level-interface.html" title="backward to &quot;3 Low-level interface&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="index.html" title="up to &quot;Marketplace: Network-Aware Programming&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="Management_and_Monitoring.html" title="forward to &quot;5 Management and Monitoring&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div><h3>4<tt>&nbsp;</tt><a name="(part._.Drivers)"></a>Drivers</h3><h4>4.1<tt>&nbsp;</tt><a name="(part._event-relay)"></a><a name="(mod-path._marketplace/drivers/event-relay)"></a>event-relay</h4><p><div class="SIntrapara"><table cellspacing="0" class="defmodule"><tr><td align="left" colspan="2"><span class="hspace">&nbsp;</span><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="stt"> </span><a href="Drivers.html#%28mod-path._marketplace%2Fdrivers%2Fevent-relay%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace/drivers/event-relay</span></a><span class="RktPn">)</span></td></tr><tr><td align="left">&nbsp;</td><td align="right"><span class="RpackageSpec"><span class="Smaller">&nbsp;package:</span> <span class="stt">marketplace</span></span></td></tr></table></div><div class="SIntrapara"><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._marketplace/drivers/event-relay..rkt)._event-relay))"></a><span title="Provided from: marketplace/drivers/event-relay"><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Fevent-relay..rkt%29._event-relay%29%29" class="RktValDef RktValLink" data-pltdoc="x">event-relay</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">self-id</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Spawn%29%29" class="RktValLink" data-pltdoc="x">Spawn</a></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">self-id</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Symbol%29%29" class="RktStxLink" data-pltdoc="x">Symbol</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Lets processes in some nested VM interact with the outside
world using <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._ground-vm%29%29" class="RktStxLink" data-pltdoc="x">ground-vm</a></span>-level event-based subscriptions.</div></p></div><div class="SIntrapara">Returns a <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></span> which starts an event-relay process with
debug-name <span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">event-relay</span><span class="stt"> </span><span class="RktRdr">,</span><span class="RktVar">self-id</span><span class="RktVal">)</span>.</div><div class="SIntrapara">The relay process observes subscriptions matching the topic-pattern
<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="stt"> </span><span class="RktPn">(</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="stt"> </span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/sync.html#%28def._%28%28quote._~23~25kernel%29._evt~3f%29%29" class="RktValLink" data-pltdoc="x">evt?</a></span><span class="RktPn">)</span><span class="stt"> </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>, and when one appears, constructs an
analogous one using <span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._at-meta-level%29%29" class="RktValLink" data-pltdoc="x">at-meta-level</a></span> to connect to the next VM
down the stack. Messages from the meta-level will be relayed up to the
current level. When the subscription disappears, the relay withdraws
the subscription at the meta-level as well.</div></p><h4>4.2<tt>&nbsp;</tt><a name="(part._tcp-bare)"></a><a name="(mod-path._marketplace/drivers/tcp-bare)"></a>tcp-bare</h4><p><div class="SIntrapara"><table cellspacing="0" class="defmodule"><tr><td align="left" colspan="2"><span class="hspace">&nbsp;</span><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="stt"> </span><a href="Drivers.html#%28mod-path._marketplace%2Fdrivers%2Ftcp-bare%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace/drivers/tcp-bare</span></a><span class="RktPn">)</span></td></tr><tr><td align="left">&nbsp;</td><td align="right"><span class="RpackageSpec"><span class="Smaller">&nbsp;package:</span> <span class="stt">marketplace</span></span></td></tr></table></div><div class="SIntrapara">This module is only available for use by untyped Racket processes. It
is included by default in programs using <span class="stt">#lang marketplace</span>; see
<a href="high-level-interface.html#%28part._hashlang-variations%29" data-pltdoc="x">Using <span class="stt">#lang marketplace</span> and friends</a> for information on other language
variants.</div><div class="SIntrapara"><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-driver))"></a><span title="Provided from: marketplace/drivers/tcp-bare"><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-driver%29%29" class="RktValDef RktValLink" data-pltdoc="x">tcp-driver</a></span></span><span class="RktPn"></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Spawn%29%29" class="RktValLink" data-pltdoc="x">Spawn</a></span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Returns a <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></span> action which starts a TCP driver. The TCP
driver should run either directly in a ground VM, or in a nested VM
with a running <span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Fevent-relay..rkt%29._event-relay%29%29" class="RktValLink" data-pltdoc="x">event-relay</a></span>.</div></p></div><div class="SIntrapara"><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp))"></a><span title="Provided from: marketplace/drivers/tcp-bare"><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp%29%29" class="RktValDef RktValLink" data-pltdoc="x">tcp</a></span></span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Spawn%29%29" class="RktValLink" data-pltdoc="x">Spawn</a></span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">A pre-made <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></span> action equivalent to <span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-driver%29%29" class="RktValLink" data-pltdoc="x">tcp-driver</a></span><span class="RktPn">)</span>.</div></p></div></p><h5>4.2.1<tt>&nbsp;</tt><a name="(part._.T.C.P_channels)"></a>TCP channels</h5><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>struct</p></div></div><table cellspacing="0" class="RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span></td><td><span class="hspace">&nbsp;</span></td><td><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-channel-subpacket))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-channel-destination))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-channel-source))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-channel~3f))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._struct~3atcp-channel))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-channel))"></a><span title="Provided from: marketplace/drivers/tcp-bare"><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValDef RktValLink" data-pltdoc="x">tcp-channel</a></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">source</span><span class="stt"> </span><span class="RktSym">destination</span><span class="stt"> </span><span class="RktSym">subpacket</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="RktPn">#:prefab</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">source</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym">TcpAddress</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">destination</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym">TcpAddress</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">subpacket</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym">TcpSubPacket</span></td></tr></table></blockquote></div><div class="SIntrapara">A TCP channel represents a section of a unidirectional TCP flow
appearing on our local "subnet" of the full TCP network, complete with
source, destination and subpacket. Each TCP connection has two such
flows: one inbound (remote-to-local) bytestream, and one outbound
(local-to-remote) bytestream.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>type</p></div></div><p class="RForeground"><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._.Tcp.Sub.Packet))"></a><span title="Provided from: marketplace/drivers/tcp-bare"><span class="RktSym"><span class="RktSymDef RktSym">TcpSubPacket</span></span></span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace">&nbsp;</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="hspace">&nbsp;</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="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Packets carried by <span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span> structures are either
end-of-file objects or raw binary data represented as Racket byte
vectors.</div></p><h5>4.2.2<tt>&nbsp;</tt><a name="(part._.T.C.P_addresses)"></a>TCP addresses</h5><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>type</p></div></div><p class="RForeground"><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._.Tcp.Address))"></a><span title="Provided from: marketplace/drivers/tcp-bare"><span class="RktSym"><span class="RktSymDef RktSym">TcpAddress</span></span></span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-address~3f%29%29" class="RktValLink" data-pltdoc="x">tcp-address?</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-handle~3f%29%29" class="RktValLink" data-pltdoc="x">tcp-handle?</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-listener~3f%29%29" class="RktValLink" data-pltdoc="x">tcp-listener?</a></span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">A TCP address describes one end of a TCP connection. It can be either</div></p><ul><li><p>a <span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-address%29%29" class="RktValLink" data-pltdoc="x">tcp-address</a></span>, representing a remote socket;</p></li><li><p>a <span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-handle%29%29" class="RktValLink" data-pltdoc="x">tcp-handle</a></span>, representing a local socket on a kernel-assigned port; or</p></li><li><p>a <span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-listener%29%29" class="RktValLink" data-pltdoc="x">tcp-listener</a></span>, representing a local socket on a user-assigned port.</p></li></ul><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>struct</p></div></div><table cellspacing="0" class="RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span></td><td><span class="hspace">&nbsp;</span></td><td><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-address-port))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-address-host))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-address~3f))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._struct~3atcp-address))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-address))"></a><span title="Provided from: marketplace/drivers/tcp-bare"><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-address%29%29" class="RktValDef RktValLink" data-pltdoc="x">tcp-address</a></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">host</span><span class="stt"> </span><span class="RktSym">port</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="RktPn">#:prefab</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">host</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">port</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">integer-in</span><span class="hspace">&nbsp;</span><span class="RktVal">0</span><span class="hspace">&nbsp;</span><span class="RktVal">65535</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Describes a remote half-connection. The <span class="RktSym">host</span> part is to be a
string containing either a hostname (e.g. <span class="RktVal">"localhost"</span>) or an
ASCII representation of an IP address (e.g. <span class="RktVal">"127.0.0.1"</span>).</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>struct</p></div></div><table cellspacing="0" class="RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span></td><td><span class="hspace">&nbsp;</span></td><td><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-handle-id))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-handle~3f))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._struct~3atcp-handle))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-handle))"></a><span title="Provided from: marketplace/drivers/tcp-bare"><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-handle%29%29" class="RktValDef RktValLink" data-pltdoc="x">tcp-handle</a></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">id</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="RktPn">#:prefab</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">id</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym">any/c</span></td></tr></table></blockquote></div><div class="SIntrapara">Describes a local half-connection with a kernel-assigned port number.
The port number is not directly accessible; the <span class="RktSym">id</span> is used as
a local name for whichever underlying port number ends up being used.</div></p><p>The <span class="RktSym">id</span> must be chosen carefully: it is scoped to the local
VM, i.e. shared between processes in that VM, so processes must make
sure not to accidentally clash in handle ID selection. They are also
used in TcpChannel to mean a specific <span style="font-style: italic">instance</span> of a TCP
connection, so if you are likely to want to reconnect individual
flows, use different values for <span class="RktSym">id</span>.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>struct</p></div></div><table cellspacing="0" class="RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span></td><td><span class="hspace">&nbsp;</span></td><td><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-listener-port))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-listener~3f))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._struct~3atcp-listener))"></a><a name="(def._((lib._marketplace/drivers/tcp-bare..rkt)._tcp-listener))"></a><span title="Provided from: marketplace/drivers/tcp-bare"><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-listener%29%29" class="RktValDef RktValLink" data-pltdoc="x">tcp-listener</a></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">port</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="RktPn">#:prefab</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">port</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">integer-in</span><span class="hspace">&nbsp;</span><span class="RktVal">0</span><span class="hspace">&nbsp;</span><span class="RktVal">65535</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Describes a local half-connection with a user-assigned port number.
Use this to describe server sockets.</div></p><h5>4.2.3<tt>&nbsp;</tt><a name="(part._.Opening_an_outbound_connection)"></a>Opening an outbound connection</h5><p>Choose a <span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-handle%29%29" class="RktValLink" data-pltdoc="x">tcp-handle</a></span>, and then create endpoints as follows:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><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">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym">local</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-handle%29%29" class="RktValLink" data-pltdoc="x">tcp-handle</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">some-unique-value</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym">remote</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-address%29%29" class="RktValLink" data-pltdoc="x">tcp-address</a></span><span class="hspace">&nbsp;</span><span class="RktVal">"the.remote.host.example.com"</span><span class="hspace">&nbsp;</span><span class="RktVal">5999</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition%2Fno-state%29%29" class="RktStxLink" data-pltdoc="x">transition/no-state</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._publisher%29%29" class="RktStxLink" data-pltdoc="x">publisher</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</span><span class="RktSym">local</span><span class="hspace">&nbsp;</span><span class="RktSym">remote</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</span><span class="RktSym">remote</span><span class="hspace">&nbsp;</span><span class="RktSym">local</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</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">&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="hspace">&nbsp;</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Handle a received end-of-file object</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></span><span class="hspace">&nbsp;</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><span class="RktPn">]</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</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">&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktSym">data</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Handle received data</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></span><span class="hspace">&nbsp;</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><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p>The TCP driver will automatically create an outbound connection in
response to the presence of the endpoints. When the endpoints are
deleted (or the process exits), the TCP driver will notice the absence
and will close the underlying TCP socket.</p><p>For a complete example, see <a href="Examples.html#%28part._chat-client-example%29" data-pltdoc="x">TCP chat client</a>.</p><h5>4.2.4<tt>&nbsp;</tt><a name="(part._.Accepting_inbound_connections)"></a>Accepting inbound connections</h5><p>Choose a port number, and then create an <span style="font-style: italic">observer</span> endpoint as
follows:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%29%29" class="RktStxLink" data-pltdoc="x">observe-publishers</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-listener%29%29" class="RktValLink" data-pltdoc="x">tcp-listener</a></span><span class="hspace">&nbsp;</span><span class="RktVal">5999</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-conversation%29%29" class="RktStxLink" data-pltdoc="x">match-conversation</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="hspace">&nbsp;</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">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxLink" data-pltdoc="x">on-presence</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">chat-session</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</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></table></blockquote><p>The use of <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%29%29" class="RktStxLink" data-pltdoc="x">observe-publishers</a></span> here indicates that this endpoint isn&rsquo;t
actually interested in exchanging any TCP data; instead, it is
monitoring demand for such exchanges. The TCP driver uses the unusual
<span class="RktVal">'</span><span class="RktVal">everything</span> <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Interest.Type%29%29" class="RktValLink" data-pltdoc="x">InterestType</a></span> to monitor the presence of
<span class="RktVal">'</span><span class="RktVal">observer</span>s, and creates listening TCP server sockets in
response. When a connection comes in, the TCP driver spawns a manager
process which offers regular <span class="RktVal">'</span><span class="RktVal">participant</span> endpoints for
communicating on the newly-arrived socket.</p><p>To illustrate the code for handling a newly-arrived connection,</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">chat-session</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition%2Fno-state%29%29" class="RktStxLink" data-pltdoc="x">transition/no-state</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._quit%29%29" class="RktValLink" data-pltdoc="x">quit</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span><span class="hspace">&nbsp;</span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</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">&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktSym">data</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Handle incoming data</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></span><span class="hspace">&nbsp;</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><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><h5>4.2.5<tt>&nbsp;</tt><a name="(part._.Receiving_data)"></a>Receiving data</h5><p>TCP-related messages will be of the form</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</span><span class="RktSym">remote-address</span><span class="hspace">&nbsp;</span><span class="RktSym">local-address</span><span class="hspace">&nbsp;</span><span class="RktSym">subpacket</span><span class="RktPn">)</span></p></blockquote><p>where the <span class="RktSym">subpacket</span> is either <span class="RktSym"><a href="http://docs.racket-lang.org/reference/port-ops.html#%28def._%28%28quote._~23~25kernel%29._eof%29%29" class="RktValLink" data-pltdoc="x">eof</a></span> or a
<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>.</p><h5>4.2.6<tt>&nbsp;</tt><a name="(part._.Sending_data)"></a>Sending data</h5><p>Send data with</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp-channel%29%29" class="RktValLink" data-pltdoc="x">tcp-channel</a></span><span class="hspace">&nbsp;</span><span class="RktSym">local-address</span><span class="hspace">&nbsp;</span><span class="RktSym">remote-address</span><span class="hspace">&nbsp;</span><span class="RktSym">subpacket</span><span class="RktPn">)</span><span class="RktPn">)</span></p></blockquote><p>where, as for receiving data, the <span class="RktSym">subpacket</span> is either
<span class="RktSym"><a href="http://docs.racket-lang.org/reference/port-ops.html#%28def._%28%28quote._~23~25kernel%29._eof%29%29" class="RktValLink" data-pltdoc="x">eof</a></span> or a <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>.</p><h4>4.3<tt>&nbsp;</tt><a name="(part._timer__typed_and_untyped_)"></a>timer (typed and untyped)</h4><p>For examples of the use of the timer driver, see uses of
<span class="RktSym">set-timer</span> and <span class="RktSym">timer-expired</span> in
<a href="https://github.com/tonyg/marketplace-dns/blob/master/network-query.rkt">the
Marketplace-based DNS resolver</a>.</p><h4>4.4<tt>&nbsp;</tt><a name="(part._udp__typed_and_untyped_)"></a>udp (typed and untyped)</h4><p>For examples of the use of the UDP driver, see uses of
<span class="RktSym">udp-packet</span> etc. in
<a href="https://github.com/tonyg/marketplace-dns/blob/master/tk-dns.rkt">the
Marketplace-based DNS resolver</a>.</p><div class="navsetbottom"><span class="navleft">&nbsp;&nbsp;</span><span class="navright">&nbsp;&nbsp;<a href="low-level-interface.html" title="backward to &quot;3 Low-level interface&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="index.html" title="up to &quot;Marketplace: Network-Aware Programming&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="Management_and_Monitoring.html" title="forward to &quot;5 Management and Monitoring&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div></div></div><div id="contextindicator">&nbsp;</div></body></html>