xref: /nrf52832-nimble/rt-thread/components/net/uip/doc/html/a00158.html (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2*10465441SEvalZero<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3*10465441SEvalZero<title>uIP 1.0: Protosockets library</title>
4*10465441SEvalZero<link href="doxygen.css" rel="stylesheet" type="text/css">
5*10465441SEvalZero<link href="tabs.css" rel="stylesheet" type="text/css">
6*10465441SEvalZero</head><body>
7*10465441SEvalZero<!-- Generated by Doxygen 1.4.6 -->
8*10465441SEvalZero<div class="tabs">
9*10465441SEvalZero  <ul>
10*10465441SEvalZero    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
11*10465441SEvalZero    <li><a href="modules.html"><span>Modules</span></a></li>
12*10465441SEvalZero    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
13*10465441SEvalZero    <li><a href="files.html"><span>Files</span></a></li>
14*10465441SEvalZero    <li><a href="examples.html"><span>Examples</span></a></li>
15*10465441SEvalZero  </ul></div>
16*10465441SEvalZero<h1>Protosockets library</h1><hr><a name="_details"></a><h2>Detailed Description</h2>
17*10465441SEvalZeroThe protosocket library provides an interface to the uIP stack that is similar to the traditional BSD socket interface.
18*10465441SEvalZero<p>
19*10465441SEvalZeroUnlike programs written for the ordinary uIP event-driven interface, programs written with the protosocket library are executed in a sequential fashion and does not have to be implemented as explicit state machines.<p>
20*10465441SEvalZeroProtosockets only work with TCP connections.<p>
21*10465441SEvalZeroThe protosocket library uses <a class="el" href="a00142.html">Protothreads</a> protothreads to provide sequential control flow. This makes the protosockets lightweight in terms of memory, but also means that protosockets inherits the functional limitations of protothreads. Each protosocket lives only within a single function. Automatic variables (stack variables) are not retained across a protosocket library function call.<p>
22*10465441SEvalZero<dl compact><dt><b>Note:</b></dt><dd>Because the protosocket library uses protothreads, local variables will not always be saved across a call to a protosocket library function. It is therefore advised that local variables are used with extreme care.</dd></dl>
23*10465441SEvalZeroThe protosocket library provides functions for sending data without having to deal with retransmissions and acknowledgements, as well as functions for reading data without having to deal with data being split across more than one TCP segment.<p>
24*10465441SEvalZeroBecause each protosocket runs as a protothread, the protosocket has to be started with a call to <a class="el" href="a00158.html#g84901a5aa60040e96d272a69977edd22">PSOCK_BEGIN()</a> at the start of the function in which the protosocket is used. Similarly, the protosocket protothread can be terminated by a call to <a class="el" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT()</a>.
25*10465441SEvalZero<p>
26*10465441SEvalZero<table border="0" cellpadding="0" cellspacing="0">
27*10465441SEvalZero<tr><td></td></tr>
28*10465441SEvalZero<tr><td colspan="2"><br><h2>Files</h2></td></tr>
29*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00127.html">psock.h</a></td></tr>
30*10465441SEvalZero
31*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Protosocket library header file. <br></td></tr>
32*10465441SEvalZero
33*10465441SEvalZero<p>
34*10465441SEvalZero<tr><td colspan="2"><br><h2>Data Structures</h2></td></tr>
35*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00083.html">psock_buf</a></td></tr>
36*10465441SEvalZero
37*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html">psock</a></td></tr>
38*10465441SEvalZero
39*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The representation of a protosocket.  <a href="a00082.html#_details">More...</a><br></td></tr>
40*10465441SEvalZero<tr><td colspan="2"><br><h2>Defines</h2></td></tr>
41*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g26ae707402e494f3895a9f012a93ea29">PSOCK_INIT</a>(<a class="el" href="a00082.html">psock</a>, buffer, buffersize)</td></tr>
42*10465441SEvalZero
43*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initialize a protosocket.  <a href="#g26ae707402e494f3895a9f012a93ea29"></a><br></td></tr>
44*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g84901a5aa60040e96d272a69977edd22">PSOCK_BEGIN</a>(<a class="el" href="a00082.html">psock</a>)</td></tr>
45*10465441SEvalZero
46*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Start the protosocket protothread in a function.  <a href="#g84901a5aa60040e96d272a69977edd22"></a><br></td></tr>
47*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g70d236d1cf34b4e21836edda60247b70">PSOCK_SEND</a>(<a class="el" href="a00082.html">psock</a>, data, datalen)</td></tr>
48*10465441SEvalZero
49*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Send data.  <a href="#g70d236d1cf34b4e21836edda60247b70"></a><br></td></tr>
50*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(<a class="el" href="a00082.html">psock</a>, str)</td></tr>
51*10465441SEvalZero
52*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Send a null-terminated string.  <a href="#gb0ad55aa96dd1d200cd0fc5a99f6a4f7"></a><br></td></tr>
53*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g10d9a9201cba1a6db623284c475c6cea">PSOCK_GENERATOR_SEND</a>(<a class="el" href="a00082.html">psock</a>, generator, arg)</td></tr>
54*10465441SEvalZero
55*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Generate data with a function and send it.  <a href="#g10d9a9201cba1a6db623284c475c6cea"></a><br></td></tr>
56*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(<a class="el" href="a00082.html">psock</a>)</td></tr>
57*10465441SEvalZero
58*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Close a protosocket.  <a href="#g5d56800f82bfc7bbf53bb4a659589812"></a><br></td></tr>
59*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#gd895ab98c54d9966ff554aa873151751">PSOCK_READBUF</a>(<a class="el" href="a00082.html">psock</a>)</td></tr>
60*10465441SEvalZero
61*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Read data until the buffer is full.  <a href="#gd895ab98c54d9966ff554aa873151751"></a><br></td></tr>
62*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(<a class="el" href="a00082.html">psock</a>, c)</td></tr>
63*10465441SEvalZero
64*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Read data up to a specified character.  <a href="#gb5d9c0becf7cb32d0aaef466839dd92e"></a><br></td></tr>
65*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g4ab2de595d36e9e55dd61f6ecd139162">PSOCK_DATALEN</a>(<a class="el" href="a00082.html">psock</a>)</td></tr>
66*10465441SEvalZero
67*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The length of the data that was previously read.  <a href="#g4ab2de595d36e9e55dd61f6ecd139162"></a><br></td></tr>
68*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT</a>(<a class="el" href="a00082.html">psock</a>)</td></tr>
69*10465441SEvalZero
70*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Exit the protosocket's protothread.  <a href="#gfa11b2a1faf395ae2a6626e01c482d5d"></a><br></td></tr>
71*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#gc7cc1dba1819f7fcdaa9ff9eed5a08f4">PSOCK_CLOSE_EXIT</a>(<a class="el" href="a00082.html">psock</a>)</td></tr>
72*10465441SEvalZero
73*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Close a protosocket and exit the protosocket's protothread.  <a href="#gc7cc1dba1819f7fcdaa9ff9eed5a08f4"></a><br></td></tr>
74*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g4a264bb64ae706d53f572b1d9e4037a2">PSOCK_END</a>(<a class="el" href="a00082.html">psock</a>)</td></tr>
75*10465441SEvalZero
76*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Declare the end of a protosocket's protothread.  <a href="#g4a264bb64ae706d53f572b1d9e4037a2"></a><br></td></tr>
77*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g55ce98ea4d6f22e9d5068b904d4d2447">PSOCK_NEWDATA</a>(<a class="el" href="a00082.html">psock</a>)</td></tr>
78*10465441SEvalZero
79*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check if new data has arrived on a protosocket.  <a href="#g55ce98ea4d6f22e9d5068b904d4d2447"></a><br></td></tr>
80*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g2ebfe5c8a7f3173714efdf2df74fc392">PSOCK_WAIT_UNTIL</a>(<a class="el" href="a00082.html">psock</a>, condition)</td></tr>
81*10465441SEvalZero
82*10465441SEvalZero<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Wait until a condition is true.  <a href="#g2ebfe5c8a7f3173714efdf2df74fc392"></a><br></td></tr>
83*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga87ff36af81990e6ffe20d76d5e4606f"></a><!-- doxytag: member="psock::PSOCK_WAIT_THREAD" ref="ga87ff36af81990e6ffe20d76d5e4606f" args="(psock, condition)" -->
84*10465441SEvalZero#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#ga87ff36af81990e6ffe20d76d5e4606f">PSOCK_WAIT_THREAD</a>(<a class="el" href="a00082.html">psock</a>, condition)&nbsp;&nbsp;&nbsp;PT_WAIT_THREAD(&amp;((<a class="el" href="a00082.html">psock</a>)-&gt;<a class="el" href="a00084.html">pt</a>), (condition))</td></tr>
85*10465441SEvalZero
86*10465441SEvalZero<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
87*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g3178402dd725776415bf9745e7bf92ba"></a><!-- doxytag: member="psock::psock_datalen" ref="g3178402dd725776415bf9745e7bf92ba" args="(struct psock *psock)" -->
88*10465441SEvalZero<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g3178402dd725776415bf9745e7bf92ba">psock_datalen</a> (struct <a class="el" href="a00082.html">psock</a> *<a class="el" href="a00082.html">psock</a>)</td></tr>
89*10465441SEvalZero
90*10465441SEvalZero<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g3b19f65e48079d8105be2a99b5b4b2ae"></a><!-- doxytag: member="psock::psock_newdata" ref="g3b19f65e48079d8105be2a99b5b4b2ae" args="(struct psock *s)" -->
91*10465441SEvalZerochar&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00158.html#g3b19f65e48079d8105be2a99b5b4b2ae">psock_newdata</a> (struct <a class="el" href="a00082.html">psock</a> *s)</td></tr>
92*10465441SEvalZero
93*10465441SEvalZero</table>
94*10465441SEvalZero<hr><h2>Define Documentation</h2>
95*10465441SEvalZero<a class="anchor" name="g84901a5aa60040e96d272a69977edd22"></a><!-- doxytag: member="psock.h::PSOCK_BEGIN" ref="g84901a5aa60040e96d272a69977edd22" args="(psock)" --><p>
96*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
97*10465441SEvalZero  <tr>
98*10465441SEvalZero    <td class="mdRow">
99*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
100*10465441SEvalZero        <tr>
101*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_BEGIN          </td>
102*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
103*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>&nbsp;</td>
104*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
105*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
106*10465441SEvalZero          <td class="md" nowrap></td>
107*10465441SEvalZero        </tr>
108*10465441SEvalZero      </table>
109*10465441SEvalZero    </td>
110*10465441SEvalZero  </tr>
111*10465441SEvalZero</table>
112*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
113*10465441SEvalZero  <tr>
114*10465441SEvalZero    <td>
115*10465441SEvalZero      &nbsp;
116*10465441SEvalZero    </td>
117*10465441SEvalZero    <td>
118*10465441SEvalZero
119*10465441SEvalZero<p>
120*10465441SEvalZeroStart the protosocket protothread in a function.
121*10465441SEvalZero<p>
122*10465441SEvalZeroThis macro starts the protothread associated with the protosocket and must come before other protosocket calls in the function it is used.<p>
123*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
124*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
125*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket to be started. </td></tr>
126*10465441SEvalZero  </table>
127*10465441SEvalZero</dl>
128*10465441SEvalZero<dl compact><dt><b>Examples: </b></dt><dd>
129*10465441SEvalZero<a class="el" href="a00036.html#a111">hello-world.c</a>, and <a class="el" href="a00038.html#a166">smtp.c</a>.</dl>
130*10465441SEvalZero<p>
131*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00158">158</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
132*10465441SEvalZero  </tr>
133*10465441SEvalZero</table>
134*10465441SEvalZero<a class="anchor" name="g5d56800f82bfc7bbf53bb4a659589812"></a><!-- doxytag: member="psock.h::PSOCK_CLOSE" ref="g5d56800f82bfc7bbf53bb4a659589812" args="(psock)" --><p>
135*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
136*10465441SEvalZero  <tr>
137*10465441SEvalZero    <td class="mdRow">
138*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
139*10465441SEvalZero        <tr>
140*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_CLOSE          </td>
141*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
142*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>&nbsp;</td>
143*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
144*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
145*10465441SEvalZero          <td class="md" nowrap></td>
146*10465441SEvalZero        </tr>
147*10465441SEvalZero      </table>
148*10465441SEvalZero    </td>
149*10465441SEvalZero  </tr>
150*10465441SEvalZero</table>
151*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
152*10465441SEvalZero  <tr>
153*10465441SEvalZero    <td>
154*10465441SEvalZero      &nbsp;
155*10465441SEvalZero    </td>
156*10465441SEvalZero    <td>
157*10465441SEvalZero
158*10465441SEvalZero<p>
159*10465441SEvalZeroClose a protosocket.
160*10465441SEvalZero<p>
161*10465441SEvalZeroThis macro closes a protosocket and can only be called from within the protothread in which the protosocket lives.<p>
162*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
163*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
164*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket that is to be closed. </td></tr>
165*10465441SEvalZero  </table>
166*10465441SEvalZero</dl>
167*10465441SEvalZero<dl compact><dt><b>Examples: </b></dt><dd>
168*10465441SEvalZero<a class="el" href="a00036.html#a115">hello-world.c</a>, and <a class="el" href="a00038.html#a169">smtp.c</a>.</dl>
169*10465441SEvalZero<p>
170*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00235">235</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
171*10465441SEvalZero  </tr>
172*10465441SEvalZero</table>
173*10465441SEvalZero<a class="anchor" name="gc7cc1dba1819f7fcdaa9ff9eed5a08f4"></a><!-- doxytag: member="psock.h::PSOCK_CLOSE_EXIT" ref="gc7cc1dba1819f7fcdaa9ff9eed5a08f4" args="(psock)" --><p>
174*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
175*10465441SEvalZero  <tr>
176*10465441SEvalZero    <td class="mdRow">
177*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
178*10465441SEvalZero        <tr>
179*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_CLOSE_EXIT          </td>
180*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
181*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>&nbsp;</td>
182*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
183*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
184*10465441SEvalZero          <td class="md" nowrap></td>
185*10465441SEvalZero        </tr>
186*10465441SEvalZero      </table>
187*10465441SEvalZero    </td>
188*10465441SEvalZero  </tr>
189*10465441SEvalZero</table>
190*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
191*10465441SEvalZero  <tr>
192*10465441SEvalZero    <td>
193*10465441SEvalZero      &nbsp;
194*10465441SEvalZero    </td>
195*10465441SEvalZero    <td>
196*10465441SEvalZero
197*10465441SEvalZero<p>
198*10465441SEvalZeroClose a protosocket and exit the protosocket's protothread.
199*10465441SEvalZero<p>
200*10465441SEvalZeroThis macro closes a protosocket and exits the protosocket's protothread.<p>
201*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
202*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
203*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket. </td></tr>
204*10465441SEvalZero  </table>
205*10465441SEvalZero</dl>
206*10465441SEvalZero
207*10465441SEvalZero<p>
208*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00308">308</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
209*10465441SEvalZero  </tr>
210*10465441SEvalZero</table>
211*10465441SEvalZero<a class="anchor" name="g4ab2de595d36e9e55dd61f6ecd139162"></a><!-- doxytag: member="psock.h::PSOCK_DATALEN" ref="g4ab2de595d36e9e55dd61f6ecd139162" args="(psock)" --><p>
212*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
213*10465441SEvalZero  <tr>
214*10465441SEvalZero    <td class="mdRow">
215*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
216*10465441SEvalZero        <tr>
217*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_DATALEN          </td>
218*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
219*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>&nbsp;</td>
220*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
221*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
222*10465441SEvalZero          <td class="md" nowrap></td>
223*10465441SEvalZero        </tr>
224*10465441SEvalZero      </table>
225*10465441SEvalZero    </td>
226*10465441SEvalZero  </tr>
227*10465441SEvalZero</table>
228*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
229*10465441SEvalZero  <tr>
230*10465441SEvalZero    <td>
231*10465441SEvalZero      &nbsp;
232*10465441SEvalZero    </td>
233*10465441SEvalZero    <td>
234*10465441SEvalZero
235*10465441SEvalZero<p>
236*10465441SEvalZeroThe length of the data that was previously read.
237*10465441SEvalZero<p>
238*10465441SEvalZeroThis macro returns the length of the data that was previously read using <a class="el" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO()</a> or PSOCK_READ().<p>
239*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
240*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
241*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket holding the data. </td></tr>
242*10465441SEvalZero  </table>
243*10465441SEvalZero</dl>
244*10465441SEvalZero
245*10465441SEvalZero<p>
246*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00281">281</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
247*10465441SEvalZero  </tr>
248*10465441SEvalZero</table>
249*10465441SEvalZero<a class="anchor" name="g4a264bb64ae706d53f572b1d9e4037a2"></a><!-- doxytag: member="psock.h::PSOCK_END" ref="g4a264bb64ae706d53f572b1d9e4037a2" args="(psock)" --><p>
250*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
251*10465441SEvalZero  <tr>
252*10465441SEvalZero    <td class="mdRow">
253*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
254*10465441SEvalZero        <tr>
255*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_END          </td>
256*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
257*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>&nbsp;</td>
258*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
259*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
260*10465441SEvalZero          <td class="md" nowrap></td>
261*10465441SEvalZero        </tr>
262*10465441SEvalZero      </table>
263*10465441SEvalZero    </td>
264*10465441SEvalZero  </tr>
265*10465441SEvalZero</table>
266*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
267*10465441SEvalZero  <tr>
268*10465441SEvalZero    <td>
269*10465441SEvalZero      &nbsp;
270*10465441SEvalZero    </td>
271*10465441SEvalZero    <td>
272*10465441SEvalZero
273*10465441SEvalZero<p>
274*10465441SEvalZeroDeclare the end of a protosocket's protothread.
275*10465441SEvalZero<p>
276*10465441SEvalZeroThis macro is used for declaring that the protosocket's protothread ends. It must always be used together with a matching <a class="el" href="a00158.html#g84901a5aa60040e96d272a69977edd22">PSOCK_BEGIN()</a> macro.<p>
277*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
278*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
279*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket. </td></tr>
280*10465441SEvalZero  </table>
281*10465441SEvalZero</dl>
282*10465441SEvalZero<dl compact><dt><b>Examples: </b></dt><dd>
283*10465441SEvalZero<a class="el" href="a00036.html#a116">hello-world.c</a>, and <a class="el" href="a00038.html#a182">smtp.c</a>.</dl>
284*10465441SEvalZero<p>
285*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00325">325</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
286*10465441SEvalZero  </tr>
287*10465441SEvalZero</table>
288*10465441SEvalZero<a class="anchor" name="gfa11b2a1faf395ae2a6626e01c482d5d"></a><!-- doxytag: member="psock.h::PSOCK_EXIT" ref="gfa11b2a1faf395ae2a6626e01c482d5d" args="(psock)" --><p>
289*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
290*10465441SEvalZero  <tr>
291*10465441SEvalZero    <td class="mdRow">
292*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
293*10465441SEvalZero        <tr>
294*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_EXIT          </td>
295*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
296*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>&nbsp;</td>
297*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
298*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
299*10465441SEvalZero          <td class="md" nowrap></td>
300*10465441SEvalZero        </tr>
301*10465441SEvalZero      </table>
302*10465441SEvalZero    </td>
303*10465441SEvalZero  </tr>
304*10465441SEvalZero</table>
305*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
306*10465441SEvalZero  <tr>
307*10465441SEvalZero    <td>
308*10465441SEvalZero      &nbsp;
309*10465441SEvalZero    </td>
310*10465441SEvalZero    <td>
311*10465441SEvalZero
312*10465441SEvalZero<p>
313*10465441SEvalZeroExit the protosocket's protothread.
314*10465441SEvalZero<p>
315*10465441SEvalZeroThis macro terminates the protothread of the protosocket and should almost always be used in conjunction with <a class="el" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE()</a>.<p>
316*10465441SEvalZero<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00158.html#gc7cc1dba1819f7fcdaa9ff9eed5a08f4">PSOCK_CLOSE_EXIT()</a></dd></dl>
317*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
318*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
319*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket. </td></tr>
320*10465441SEvalZero  </table>
321*10465441SEvalZero</dl>
322*10465441SEvalZero<dl compact><dt><b>Examples: </b></dt><dd>
323*10465441SEvalZero<a class="el" href="a00038.html#a171">smtp.c</a>.</dl>
324*10465441SEvalZero<p>
325*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00297">297</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
326*10465441SEvalZero  </tr>
327*10465441SEvalZero</table>
328*10465441SEvalZero<a class="anchor" name="g10d9a9201cba1a6db623284c475c6cea"></a><!-- doxytag: member="psock.h::PSOCK_GENERATOR_SEND" ref="g10d9a9201cba1a6db623284c475c6cea" args="(psock, generator, arg)" --><p>
329*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
330*10465441SEvalZero  <tr>
331*10465441SEvalZero    <td class="mdRow">
332*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
333*10465441SEvalZero        <tr>
334*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_GENERATOR_SEND          </td>
335*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
336*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>,         <tr>
337*10465441SEvalZero          <td class="md" nowrap align="right"></td>
338*10465441SEvalZero          <td class="md"></td>
339*10465441SEvalZero          <td class="md" nowrap>generator,         <tr>
340*10465441SEvalZero          <td class="md" nowrap align="right"></td>
341*10465441SEvalZero          <td class="md"></td>
342*10465441SEvalZero          <td class="md" nowrap>arg&nbsp;</td>
343*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
344*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
345*10465441SEvalZero          <td class="md" nowrap></td>
346*10465441SEvalZero        </tr>
347*10465441SEvalZero      </table>
348*10465441SEvalZero    </td>
349*10465441SEvalZero  </tr>
350*10465441SEvalZero</table>
351*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
352*10465441SEvalZero  <tr>
353*10465441SEvalZero    <td>
354*10465441SEvalZero      &nbsp;
355*10465441SEvalZero    </td>
356*10465441SEvalZero    <td>
357*10465441SEvalZero
358*10465441SEvalZero<p>
359*10465441SEvalZeroGenerate data with a function and send it.
360*10465441SEvalZero<p>
361*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
362*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
363*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>Pointer to the protosocket. </td></tr>
364*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>generator</em>&nbsp;</td><td>Pointer to the generator function </td></tr>
365*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>arg</em>&nbsp;</td><td>Argument to the generator function</td></tr>
366*10465441SEvalZero  </table>
367*10465441SEvalZero</dl>
368*10465441SEvalZeroThis function generates data and sends it over the protosocket. This can be used to dynamically generate data for a transmission, instead of generating the data in a buffer beforehand. This function reduces the need for buffer memory. The generator function is implemented by the application, and a pointer to the function is given as an argument with the call to <a class="el" href="a00158.html#g10d9a9201cba1a6db623284c475c6cea">PSOCK_GENERATOR_SEND()</a>.<p>
369*10465441SEvalZeroThe generator function should place the generated data directly in the uip_appdata buffer, and return the length of the generated data. The generator function is called by the protosocket layer when the data first is sent, and once for every retransmission that is needed.
370*10465441SEvalZero<p>
371*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00219">219</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
372*10465441SEvalZero  </tr>
373*10465441SEvalZero</table>
374*10465441SEvalZero<a class="anchor" name="g26ae707402e494f3895a9f012a93ea29"></a><!-- doxytag: member="psock.h::PSOCK_INIT" ref="g26ae707402e494f3895a9f012a93ea29" args="(psock, buffer, buffersize)" --><p>
375*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
376*10465441SEvalZero  <tr>
377*10465441SEvalZero    <td class="mdRow">
378*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
379*10465441SEvalZero        <tr>
380*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_INIT          </td>
381*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
382*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>,         <tr>
383*10465441SEvalZero          <td class="md" nowrap align="right"></td>
384*10465441SEvalZero          <td class="md"></td>
385*10465441SEvalZero          <td class="md" nowrap>buffer,         <tr>
386*10465441SEvalZero          <td class="md" nowrap align="right"></td>
387*10465441SEvalZero          <td class="md"></td>
388*10465441SEvalZero          <td class="md" nowrap>buffersize&nbsp;</td>
389*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
390*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
391*10465441SEvalZero          <td class="md" nowrap></td>
392*10465441SEvalZero        </tr>
393*10465441SEvalZero      </table>
394*10465441SEvalZero    </td>
395*10465441SEvalZero  </tr>
396*10465441SEvalZero</table>
397*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
398*10465441SEvalZero  <tr>
399*10465441SEvalZero    <td>
400*10465441SEvalZero      &nbsp;
401*10465441SEvalZero    </td>
402*10465441SEvalZero    <td>
403*10465441SEvalZero
404*10465441SEvalZero<p>
405*10465441SEvalZeroInitialize a protosocket.
406*10465441SEvalZero<p>
407*10465441SEvalZeroThis macro initializes a protosocket and must be called before the protosocket is used. The initialization also specifies the input buffer for the protosocket.<p>
408*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
409*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
410*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket to be initialized</td></tr>
411*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>buffer</em>&nbsp;</td><td>(char *) A pointer to the input buffer for the protosocket.</td></tr>
412*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>buffersize</em>&nbsp;</td><td>(unsigned int) The size of the input buffer. </td></tr>
413*10465441SEvalZero  </table>
414*10465441SEvalZero</dl>
415*10465441SEvalZero<dl compact><dt><b>Examples: </b></dt><dd>
416*10465441SEvalZero<a class="el" href="a00036.html#a108">hello-world.c</a>, and <a class="el" href="a00038.html#a193">smtp.c</a>.</dl>
417*10465441SEvalZero<p>
418*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00144">144</a> of file <a class="el" href="a00193.html">psock.h</a>.
419*10465441SEvalZero<p>
420*10465441SEvalZeroReferenced by <a class="el" href="a00170.html#l00055">hello_world_appcall()</a>, <a class="el" href="a00184.html#l00298">httpd_appcall()</a>, and <a class="el" href="a00174.html#l00233">smtp_send()</a>.    </td>
421*10465441SEvalZero  </tr>
422*10465441SEvalZero</table>
423*10465441SEvalZero<a class="anchor" name="g55ce98ea4d6f22e9d5068b904d4d2447"></a><!-- doxytag: member="psock.h::PSOCK_NEWDATA" ref="g55ce98ea4d6f22e9d5068b904d4d2447" args="(psock)" --><p>
424*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
425*10465441SEvalZero  <tr>
426*10465441SEvalZero    <td class="mdRow">
427*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
428*10465441SEvalZero        <tr>
429*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_NEWDATA          </td>
430*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
431*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>&nbsp;</td>
432*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
433*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
434*10465441SEvalZero          <td class="md" nowrap></td>
435*10465441SEvalZero        </tr>
436*10465441SEvalZero      </table>
437*10465441SEvalZero    </td>
438*10465441SEvalZero  </tr>
439*10465441SEvalZero</table>
440*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
441*10465441SEvalZero  <tr>
442*10465441SEvalZero    <td>
443*10465441SEvalZero      &nbsp;
444*10465441SEvalZero    </td>
445*10465441SEvalZero    <td>
446*10465441SEvalZero
447*10465441SEvalZero<p>
448*10465441SEvalZeroCheck if new data has arrived on a protosocket.
449*10465441SEvalZero<p>
450*10465441SEvalZeroThis macro is used in conjunction with the <a class="el" href="a00158.html#g2ebfe5c8a7f3173714efdf2df74fc392">PSOCK_WAIT_UNTIL()</a> macro to check if data has arrived on a protosocket.<p>
451*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
452*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
453*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket. </td></tr>
454*10465441SEvalZero  </table>
455*10465441SEvalZero</dl>
456*10465441SEvalZero
457*10465441SEvalZero<p>
458*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00339">339</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
459*10465441SEvalZero  </tr>
460*10465441SEvalZero</table>
461*10465441SEvalZero<a class="anchor" name="gd895ab98c54d9966ff554aa873151751"></a><!-- doxytag: member="psock.h::PSOCK_READBUF" ref="gd895ab98c54d9966ff554aa873151751" args="(psock)" --><p>
462*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
463*10465441SEvalZero  <tr>
464*10465441SEvalZero    <td class="mdRow">
465*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
466*10465441SEvalZero        <tr>
467*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_READBUF          </td>
468*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
469*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>&nbsp;</td>
470*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
471*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
472*10465441SEvalZero          <td class="md" nowrap></td>
473*10465441SEvalZero        </tr>
474*10465441SEvalZero      </table>
475*10465441SEvalZero    </td>
476*10465441SEvalZero  </tr>
477*10465441SEvalZero</table>
478*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
479*10465441SEvalZero  <tr>
480*10465441SEvalZero    <td>
481*10465441SEvalZero      &nbsp;
482*10465441SEvalZero    </td>
483*10465441SEvalZero    <td>
484*10465441SEvalZero
485*10465441SEvalZero<p>
486*10465441SEvalZeroRead data until the buffer is full.
487*10465441SEvalZero<p>
488*10465441SEvalZeroThis macro will block waiting for data and read the data into the input buffer specified with the call to <a class="el" href="a00158.html#g26ae707402e494f3895a9f012a93ea29">PSOCK_INIT()</a>. Data is read until the buffer is full..<p>
489*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
490*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
491*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket from which data should be read. </td></tr>
492*10465441SEvalZero  </table>
493*10465441SEvalZero</dl>
494*10465441SEvalZero
495*10465441SEvalZero<p>
496*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00250">250</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
497*10465441SEvalZero  </tr>
498*10465441SEvalZero</table>
499*10465441SEvalZero<a class="anchor" name="gb5d9c0becf7cb32d0aaef466839dd92e"></a><!-- doxytag: member="psock.h::PSOCK_READTO" ref="gb5d9c0becf7cb32d0aaef466839dd92e" args="(psock, c)" --><p>
500*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
501*10465441SEvalZero  <tr>
502*10465441SEvalZero    <td class="mdRow">
503*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
504*10465441SEvalZero        <tr>
505*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_READTO          </td>
506*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
507*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>,         <tr>
508*10465441SEvalZero          <td class="md" nowrap align="right"></td>
509*10465441SEvalZero          <td class="md"></td>
510*10465441SEvalZero          <td class="md" nowrap>c&nbsp;</td>
511*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
512*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
513*10465441SEvalZero          <td class="md" nowrap></td>
514*10465441SEvalZero        </tr>
515*10465441SEvalZero      </table>
516*10465441SEvalZero    </td>
517*10465441SEvalZero  </tr>
518*10465441SEvalZero</table>
519*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
520*10465441SEvalZero  <tr>
521*10465441SEvalZero    <td>
522*10465441SEvalZero      &nbsp;
523*10465441SEvalZero    </td>
524*10465441SEvalZero    <td>
525*10465441SEvalZero
526*10465441SEvalZero<p>
527*10465441SEvalZeroRead data up to a specified character.
528*10465441SEvalZero<p>
529*10465441SEvalZeroThis macro will block waiting for data and read the data into the input buffer specified with the call to <a class="el" href="a00158.html#g26ae707402e494f3895a9f012a93ea29">PSOCK_INIT()</a>. Data is only read until the specifieed character appears in the data stream.<p>
530*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
531*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
532*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket from which data should be read.</td></tr>
533*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>c</em>&nbsp;</td><td>(char) The character at which to stop reading. </td></tr>
534*10465441SEvalZero  </table>
535*10465441SEvalZero</dl>
536*10465441SEvalZero<dl compact><dt><b>Examples: </b></dt><dd>
537*10465441SEvalZero<a class="el" href="a00036.html#a113">hello-world.c</a>, and <a class="el" href="a00038.html#a167">smtp.c</a>.</dl>
538*10465441SEvalZero<p>
539*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00268">268</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
540*10465441SEvalZero  </tr>
541*10465441SEvalZero</table>
542*10465441SEvalZero<a class="anchor" name="g70d236d1cf34b4e21836edda60247b70"></a><!-- doxytag: member="psock.h::PSOCK_SEND" ref="g70d236d1cf34b4e21836edda60247b70" args="(psock, data, datalen)" --><p>
543*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
544*10465441SEvalZero  <tr>
545*10465441SEvalZero    <td class="mdRow">
546*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
547*10465441SEvalZero        <tr>
548*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_SEND          </td>
549*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
550*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>,         <tr>
551*10465441SEvalZero          <td class="md" nowrap align="right"></td>
552*10465441SEvalZero          <td class="md"></td>
553*10465441SEvalZero          <td class="md" nowrap>data,         <tr>
554*10465441SEvalZero          <td class="md" nowrap align="right"></td>
555*10465441SEvalZero          <td class="md"></td>
556*10465441SEvalZero          <td class="md" nowrap>datalen&nbsp;</td>
557*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
558*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
559*10465441SEvalZero          <td class="md" nowrap></td>
560*10465441SEvalZero        </tr>
561*10465441SEvalZero      </table>
562*10465441SEvalZero    </td>
563*10465441SEvalZero  </tr>
564*10465441SEvalZero</table>
565*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
566*10465441SEvalZero  <tr>
567*10465441SEvalZero    <td>
568*10465441SEvalZero      &nbsp;
569*10465441SEvalZero    </td>
570*10465441SEvalZero    <td>
571*10465441SEvalZero
572*10465441SEvalZero<p>
573*10465441SEvalZeroSend data.
574*10465441SEvalZero<p>
575*10465441SEvalZeroThis macro sends data over a protosocket. The protosocket protothread blocks until all data has been sent and is known to have been received by the remote end of the TCP connection.<p>
576*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
577*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
578*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket over which data is to be sent.</td></tr>
579*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>(char *) A pointer to the data that is to be sent.</td></tr>
580*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>datalen</em>&nbsp;</td><td>(unsigned int) The length of the data that is to be sent. </td></tr>
581*10465441SEvalZero  </table>
582*10465441SEvalZero</dl>
583*10465441SEvalZero<dl compact><dt><b>Examples: </b></dt><dd>
584*10465441SEvalZero<a class="el" href="a00038.html#a178">smtp.c</a>.</dl>
585*10465441SEvalZero<p>
586*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00178">178</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
587*10465441SEvalZero  </tr>
588*10465441SEvalZero</table>
589*10465441SEvalZero<a class="anchor" name="gb0ad55aa96dd1d200cd0fc5a99f6a4f7"></a><!-- doxytag: member="psock.h::PSOCK_SEND_STR" ref="gb0ad55aa96dd1d200cd0fc5a99f6a4f7" args="(psock, str)" --><p>
590*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
591*10465441SEvalZero  <tr>
592*10465441SEvalZero    <td class="mdRow">
593*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
594*10465441SEvalZero        <tr>
595*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_SEND_STR          </td>
596*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
597*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>,         <tr>
598*10465441SEvalZero          <td class="md" nowrap align="right"></td>
599*10465441SEvalZero          <td class="md"></td>
600*10465441SEvalZero          <td class="md" nowrap>str&nbsp;</td>
601*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
602*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
603*10465441SEvalZero          <td class="md" nowrap></td>
604*10465441SEvalZero        </tr>
605*10465441SEvalZero      </table>
606*10465441SEvalZero    </td>
607*10465441SEvalZero  </tr>
608*10465441SEvalZero</table>
609*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
610*10465441SEvalZero  <tr>
611*10465441SEvalZero    <td>
612*10465441SEvalZero      &nbsp;
613*10465441SEvalZero    </td>
614*10465441SEvalZero    <td>
615*10465441SEvalZero
616*10465441SEvalZero<p>
617*10465441SEvalZeroSend a null-terminated string.
618*10465441SEvalZero<p>
619*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
620*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
621*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>Pointer to the protosocket. </td></tr>
622*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>str</em>&nbsp;</td><td>The string to be sent.</td></tr>
623*10465441SEvalZero  </table>
624*10465441SEvalZero</dl>
625*10465441SEvalZeroThis function sends a null-terminated string over the protosocket. <dl compact><dt><b>Examples: </b></dt><dd>
626*10465441SEvalZero<a class="el" href="a00036.html#a112">hello-world.c</a>, and <a class="el" href="a00038.html#a172">smtp.c</a>.</dl>
627*10465441SEvalZero<p>
628*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00191">191</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
629*10465441SEvalZero  </tr>
630*10465441SEvalZero</table>
631*10465441SEvalZero<a class="anchor" name="g2ebfe5c8a7f3173714efdf2df74fc392"></a><!-- doxytag: member="psock.h::PSOCK_WAIT_UNTIL" ref="g2ebfe5c8a7f3173714efdf2df74fc392" args="(psock, condition)" --><p>
632*10465441SEvalZero<table class="mdTable" cellpadding="2" cellspacing="0">
633*10465441SEvalZero  <tr>
634*10465441SEvalZero    <td class="mdRow">
635*10465441SEvalZero      <table cellpadding="0" cellspacing="0" border="0">
636*10465441SEvalZero        <tr>
637*10465441SEvalZero          <td class="md" nowrap valign="top">#define PSOCK_WAIT_UNTIL          </td>
638*10465441SEvalZero          <td class="md" valign="top">(&nbsp;</td>
639*10465441SEvalZero          <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a>,         <tr>
640*10465441SEvalZero          <td class="md" nowrap align="right"></td>
641*10465441SEvalZero          <td class="md"></td>
642*10465441SEvalZero          <td class="md" nowrap>condition&nbsp;</td>
643*10465441SEvalZero          <td class="mdname1" valign="top" nowrap>          </td>
644*10465441SEvalZero          <td class="md" valign="top">&nbsp;)&nbsp;</td>
645*10465441SEvalZero          <td class="md" nowrap></td>
646*10465441SEvalZero        </tr>
647*10465441SEvalZero      </table>
648*10465441SEvalZero    </td>
649*10465441SEvalZero  </tr>
650*10465441SEvalZero</table>
651*10465441SEvalZero<table cellspacing="5" cellpadding="0" border="0">
652*10465441SEvalZero  <tr>
653*10465441SEvalZero    <td>
654*10465441SEvalZero      &nbsp;
655*10465441SEvalZero    </td>
656*10465441SEvalZero    <td>
657*10465441SEvalZero
658*10465441SEvalZero<p>
659*10465441SEvalZeroWait until a condition is true.
660*10465441SEvalZero<p>
661*10465441SEvalZeroThis macro blocks the protothread until the specified condition is true. The macro <a class="el" href="a00158.html#g55ce98ea4d6f22e9d5068b904d4d2447">PSOCK_NEWDATA()</a> can be used to check if new data arrives when the protosocket is waiting.<p>
662*10465441SEvalZeroTypically, this macro is used as follows:<p>
663*10465441SEvalZero<div class="fragment"><pre class="fragment"> <a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(thread(<span class="keyword">struct</span> <a class="code" href="a00082.html">psock</a> *s, <span class="keyword">struct</span> <a class="code" href="a00087.html">timer</a> *t))
664*10465441SEvalZero {
665*10465441SEvalZero   <a class="code" href="a00158.html#g84901a5aa60040e96d272a69977edd22">PSOCK_BEGIN</a>(s);
666*10465441SEvalZero
667*10465441SEvalZero   <a class="code" href="a00158.html#g2ebfe5c8a7f3173714efdf2df74fc392">PSOCK_WAIT_UNTIL</a>(s, PSOCK_NEWADATA(s) || <a class="code" href="a00156.html#g6d71dececfce707c668e6257aad5906e">timer_expired</a>(t));
668*10465441SEvalZero
669*10465441SEvalZero   <span class="keywordflow">if</span>(<a class="code" href="a00158.html#g55ce98ea4d6f22e9d5068b904d4d2447">PSOCK_NEWDATA</a>(s)) {
670*10465441SEvalZero     <a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(s, <span class="charliteral">'\n'</span>);
671*10465441SEvalZero   } <span class="keywordflow">else</span> {
672*10465441SEvalZero     handle_timed_out(s);
673*10465441SEvalZero   }
674*10465441SEvalZero
675*10465441SEvalZero   <a class="code" href="a00158.html#g4a264bb64ae706d53f572b1d9e4037a2">PSOCK_END</a>(s);
676*10465441SEvalZero }
677*10465441SEvalZero</pre></div><p>
678*10465441SEvalZero<dl compact><dt><b>Parameters:</b></dt><dd>
679*10465441SEvalZero  <table border="0" cellspacing="2" cellpadding="0">
680*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>psock</em>&nbsp;</td><td>(struct psock *) A pointer to the protosocket. </td></tr>
681*10465441SEvalZero    <tr><td valign="top"></td><td valign="top"><em>condition</em>&nbsp;</td><td>The condition to wait for. </td></tr>
682*10465441SEvalZero  </table>
683*10465441SEvalZero</dl>
684*10465441SEvalZero
685*10465441SEvalZero<p>
686*10465441SEvalZeroDefinition at line <a class="el" href="a00193.html#l00372">372</a> of file <a class="el" href="a00193.html">psock.h</a>.    </td>
687*10465441SEvalZero  </tr>
688*10465441SEvalZero</table>
689*10465441SEvalZero<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
690*10465441SEvalZero<a href="http://www.doxygen.org/index.html">
691*10465441SEvalZero<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
692*10465441SEvalZero</body>
693*10465441SEvalZero</html>
694