📄 a00158.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>uIP 1.0: Protosockets library</title><link href="doxygen.css" rel="stylesheet" type="text/css"><link href="tabs.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.4.6 --><div class="tabs"> <ul> <li><a href="main.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="classes.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> <li><a href="examples.html"><span>Examples</span></a></li> </ul></div><h1>Protosockets library</h1><hr><a name="_details"></a><h2>Detailed Description</h2>The protosocket library provides an interface to the uIP stack that is similar to the traditional BSD socket interface. <p>Unlike 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>Protosockets only work with TCP connections.<p>The 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><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>The 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>Because 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>. <p><table border="0" cellpadding="0" cellspacing="0"><tr><td></td></tr><tr><td colspan="2"><br><h2>Files</h2></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Protosocket library header file. <br></td></tr><p><tr><td colspan="2"><br><h2>Data Structures</h2></td></tr><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><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><tr><td class="mdescLeft"> </td><td class="mdescRight">The representation of a protosocket. <a href="a00082.html#_details">More...</a><br></td></tr><tr><td colspan="2"><br><h2>Defines</h2></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Initialize a protosocket. <a href="#g26ae707402e494f3895a9f012a93ea29"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Start the protosocket protothread in a function. <a href="#g84901a5aa60040e96d272a69977edd22"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Send data. <a href="#g70d236d1cf34b4e21836edda60247b70"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Send a null-terminated string. <a href="#gb0ad55aa96dd1d200cd0fc5a99f6a4f7"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Generate data with a function and send it. <a href="#g10d9a9201cba1a6db623284c475c6cea"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Close a protosocket. <a href="#g5d56800f82bfc7bbf53bb4a659589812"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Read data until the buffer is full. <a href="#gd895ab98c54d9966ff554aa873151751"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Read data up to a specified character. <a href="#gb5d9c0becf7cb32d0aaef466839dd92e"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">The length of the data that was previously read. <a href="#g4ab2de595d36e9e55dd61f6ecd139162"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Exit the protosocket's protothread. <a href="#gfa11b2a1faf395ae2a6626e01c482d5d"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Close a protosocket and exit the protosocket's protothread. <a href="#gc7cc1dba1819f7fcdaa9ff9eed5a08f4"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Declare the end of a protosocket's protothread. <a href="#g4a264bb64ae706d53f572b1d9e4037a2"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Check if new data has arrived on a protosocket. <a href="#g55ce98ea4d6f22e9d5068b904d4d2447"></a><br></td></tr><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><tr><td class="mdescLeft"> </td><td class="mdescRight">Wait until a condition is true. <a href="#g2ebfe5c8a7f3173714efdf2df74fc392"></a><br></td></tr><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)" -->#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><tr><td colspan="2"><br><h2>Functions</h2></td></tr><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)" --><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><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)" -->char </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></table><hr><h2>Define Documentation</h2><a class="anchor" name="g84901a5aa60040e96d272a69977edd22"></a><!-- doxytag: member="psock.h::PSOCK_BEGIN" ref="g84901a5aa60040e96d272a69977edd22" args="(psock)" --><p><table class="mdTable" cellpadding="2" cellspacing="0"> <tr> <td class="mdRow"> <table cellpadding="0" cellspacing="0" border="0"> <tr> <td class="md" nowrap valign="top">#define PSOCK_BEGIN </td> <td class="md" valign="top">( </td> <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a> </td> <td class="mdname1" valign="top" nowrap> </td> <td class="md" valign="top"> ) </td> <td class="md" nowrap></td> </tr> </table> </td> </tr></table><table cellspacing="5" cellpadding="0" border="0"> <tr> <td> </td> <td><p>Start the protosocket protothread in a function. <p>This macro starts the protothread associated with the protosocket and must come before other protosocket calls in the function it is used.<p><dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <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> </table></dl><dl compact><dt><b>Examples: </b></dt><dd><a class="el" href="a00036.html#a111">hello-world.c</a>, and <a class="el" href="a00038.html#a166">smtp.c</a>.</dl><p>Definition at line <a class="el" href="a00193.html#l00158">158</a> of file <a class="el" href="a00193.html">psock.h</a>. </td> </tr></table><a class="anchor" name="g5d56800f82bfc7bbf53bb4a659589812"></a><!-- doxytag: member="psock.h::PSOCK_CLOSE" ref="g5d56800f82bfc7bbf53bb4a659589812" args="(psock)" --><p><table class="mdTable" cellpadding="2" cellspacing="0"> <tr> <td class="mdRow"> <table cellpadding="0" cellspacing="0" border="0"> <tr> <td class="md" nowrap valign="top">#define PSOCK_CLOSE </td> <td class="md" valign="top">( </td> <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a> </td> <td class="mdname1" valign="top" nowrap> </td> <td class="md" valign="top"> ) </td> <td class="md" nowrap></td> </tr> </table> </td> </tr></table><table cellspacing="5" cellpadding="0" border="0"> <tr> <td> </td> <td><p>Close a protosocket. <p>This macro closes a protosocket and can only be called from within the protothread in which the protosocket lives.<p><dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <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> </table></dl><dl compact><dt><b>Examples: </b></dt><dd><a class="el" href="a00036.html#a115">hello-world.c</a>, and <a class="el" href="a00038.html#a169">smtp.c</a>.</dl><p>Definition at line <a class="el" href="a00193.html#l00235">235</a> of file <a class="el" href="a00193.html">psock.h</a>. </td> </tr></table><a class="anchor" name="gc7cc1dba1819f7fcdaa9ff9eed5a08f4"></a><!-- doxytag: member="psock.h::PSOCK_CLOSE_EXIT" ref="gc7cc1dba1819f7fcdaa9ff9eed5a08f4" args="(psock)" --><p><table class="mdTable" cellpadding="2" cellspacing="0"> <tr> <td class="mdRow"> <table cellpadding="0" cellspacing="0" border="0"> <tr> <td class="md" nowrap valign="top">#define PSOCK_CLOSE_EXIT </td> <td class="md" valign="top">( </td> <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a> </td> <td class="mdname1" valign="top" nowrap> </td> <td class="md" valign="top"> ) </td> <td class="md" nowrap></td> </tr> </table> </td> </tr></table><table cellspacing="5" cellpadding="0" border="0"> <tr> <td> </td> <td><p>Close a protosocket and exit the protosocket's protothread. <p>This macro closes a protosocket and exits the protosocket's protothread.<p><dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>psock</em> </td><td>(struct psock *) A pointer to the protosocket. </td></tr> </table></dl><p>Definition at line <a class="el" href="a00193.html#l00308">308</a> of file <a class="el" href="a00193.html">psock.h</a>. </td> </tr></table><a class="anchor" name="g4ab2de595d36e9e55dd61f6ecd139162"></a><!-- doxytag: member="psock.h::PSOCK_DATALEN" ref="g4ab2de595d36e9e55dd61f6ecd139162" args="(psock)" --><p><table class="mdTable" cellpadding="2" cellspacing="0"> <tr> <td class="mdRow"> <table cellpadding="0" cellspacing="0" border="0"> <tr> <td class="md" nowrap valign="top">#define PSOCK_DATALEN </td> <td class="md" valign="top">( </td> <td class="md" nowrap valign="top"><a class="el" href="a00082.html">psock</a> </td> <td class="mdname1" valign="top" nowrap> </td> <td class="md" valign="top"> ) </td> <td class="md" nowrap></td> </tr> </table> </td> </tr></table><table cellspacing="5" cellpadding="0" border="0"> <tr> <td> </td>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -