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