Click here to Skip to main content
15,892,298 members
Articles / Programming Languages / C

A Generic C-Language TCP Client Application

Rate me:
Please Sign up or sign in to vote.
3.67/5 (2 votes)
9 May 2010CPOL4 min read 29.1K   793   20  
A library for writing simple TCP client applications
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>TcpClient2: Socket.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.3 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>Socket.c</h1><a href="Socket_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/// @source      Socket.c</span>
<a name="l00002"></a>00002 <span class="comment"></span><span class="comment">/// @description Implementation of the Socket facility.</span>
<a name="l00003"></a>00003 <span class="comment"></span><span class="comment">//  See licensing information in the file README.TXT.</span>
<a name="l00004"></a>00004 
<a name="l00005"></a>00005 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00006"></a>00006 
<a name="l00007"></a>00007 <span class="comment">// includes</span>
<a name="l00008"></a>00008 
<a name="l00009"></a>00009 <span class="comment">// common configuration options &amp; declarations</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;<a class="code" href="config_8h.html" title="Common configuration options &amp;amp; declarations.">config.h</a>&quot;</span>  <span class="comment">// always include first</span>
<a name="l00011"></a>00011 
<a name="l00012"></a>00012 <span class="comment">// C language includes</span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;assert.h&gt;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>  <span class="comment">// abort</span>
<a name="l00016"></a>00016 
<a name="l00017"></a>00017 <span class="comment">// Windows-specific includes</span>
<a name="l00018"></a>00018 <span class="preprocessor">#if PLATFORM(Windows)</span>
<a name="l00019"></a>00019 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(disable: 4115)</span>
<a name="l00020"></a>00020 <span class="preprocessor"></span><span class="preprocessor">#include &lt;windows.h&gt;</span>
<a name="l00021"></a>00021 <span class="preprocessor">#endif</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span>
<a name="l00023"></a>00023 <span class="comment">// Linux-specific includes</span>
<a name="l00024"></a>00024 <span class="preprocessor">#if PLATFORM(Linux)</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include &lt;fcntl.h&gt;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;arpa/inet.h&gt;</span>  <span class="comment">// inet_ntoa</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;netinet/in.h&gt;</span> <span class="comment">// sockets</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;signal.h&gt;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#endif</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span>
<a name="l00031"></a>00031 <span class="comment">// framework includes</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &quot;<a class="code" href="Socket_8h.html" title="Public interface for the Socket facility.">Socket.h</a>&quot;</span>        <span class="comment">/* socket_xxx functions  */</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include &quot;<a class="code" href="Log_8h.html" title="Public interface for the Log facility.">util/Log.h</a>&quot;</span>      <span class="comment">/* log_xxx functions     */</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &quot;<a class="code" href="Thread_8h.html" title="Public interface for class Thread.">util/Thread.h</a>&quot;</span>   <span class="comment">/* thread_xxx functions  */</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &quot;<a class="code" href="Timeout_8h.html" title="Public interface for the Timeout facility.">util/Timeout.h</a>&quot;</span>  <span class="comment">/* timeout_xxx functions */</span>
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00038"></a>00038 
<a name="l00039"></a>00039 <span class="comment">// global declarations</span>
<a name="l00040"></a>00040 <span class="comment"></span>
<a name="l00041"></a>00041 <span class="comment">/// Socket class.</span>
<a name="l00042"></a>00042 <span class="comment">/// A class that provides low level access to the Berkeley sockets used in the</span>
<a name="l00043"></a>00043 <span class="comment">/// framework.</span>
<a name="l00044"></a>00044 <span class="comment">/// @class Socket</span>
<a name="l00045"></a>00045 <span class="comment"></span><span class="comment"></span>
<a name="l00046"></a>00046 <span class="comment">/// Source identification for the Log file</span>
<a name="l00047"></a>00047 <span class="comment">/// @private @memberof Socket</span>
<a name="l00048"></a><a class="code" href="classSocket.html#a7e2c66ccc38864c00befd65cefa28c00">00048</a> <span class="comment"></span><span class="keyword">static</span> <a class="code" href="config_8h.html#a0f128c3e0c83721af0220c00554e9c4e" title="const char abbreviation">cchar</a> <a class="code" href="classClient.html#a7e2c66ccc38864c00befd65cefa28c00" title="Identification for the Log file.">sourceID</a>[] = <span class="stringliteral">&quot;ZSO&quot;</span>;
<a name="l00049"></a>00049 <span class="comment"></span>
<a name="l00050"></a>00050 <span class="comment">/// Convenience macro: length of socket address structure</span>
<a name="l00051"></a>00051 <span class="comment">/// @private @memberof Socket</span>
<a name="l00052"></a><a class="code" href="classSocket.html#a6eb7d5cea9d48177a28dd9ce6c15d763">00052</a> <span class="comment"></span><span class="keyword">enum</span> <a class="code" href="classSocket.html#a6eb7d5cea9d48177a28dd9ce6c15d763" title="Convenience macro: length of socket address structure.">SockAddrLen</a>
<a name="l00053"></a>00053 {
<a name="l00054"></a><a class="code" href="Socket_8c.html#a7c84d37521c551e449eaa3dc6e352dab">00054</a>    <a class="code" href="Socket_8c.html#a7c84d37521c551e449eaa3dc6e352dab">SOCKADDR_LEN</a> = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>sockaddr)
<a name="l00055"></a>00055 };
<a name="l00056"></a>00056 
<a name="l00057"></a>00057 <span class="comment">// for use by GenericClient</span>
<a name="l00058"></a><a class="code" href="Socket_8c.html#aa693131339ad966166894f25223a6bdb">00058</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="Socket_8c.html#aa693131339ad966166894f25223a6bdb">partialLenReceived</a>;
<a name="l00059"></a>00059 
<a name="l00060"></a>00060 <span class="comment">// internal helper function prototypes</span><span class="comment"></span>
<a name="l00061"></a>00061 <span class="comment">/// @cond hides_from_doxygen</span>
<a name="l00062"></a>00062 <span class="comment"></span> <span class="keyword">static</span> <span class="keywordtype">int</span>  <a class="code" href="classSocket.html#aadd3e5b47036ac0ab8efe79b937146ca" title="Creates a TCP socket.">createTCPsocket</a>(<span class="keywordtype">void</span>);
<a name="l00063"></a>00063 <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="classSocket.html#a57c28e0df876528e9511a55e29f3bc00" title="Waits until there&amp;#39;s some bytes available to receive, or timeout occurs.">waitRecvEvent</a>(<span class="keywordtype">int</span>, <a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a>);
<a name="l00064"></a>00064 <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="classSocket.html#afb85aa9647420dc41874760516f16f4d" title="Waits until it&amp;#39;s possible to send some bytes through the socket without blocking...">waitSendEvent</a>(<span class="keywordtype">int</span>, <a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a>);<span class="comment"></span>
<a name="l00065"></a>00065 <span class="comment">/// @endcond</span>
<a name="l00066"></a>00066 <span class="comment"></span>
<a name="l00067"></a>00067 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00068"></a>00068 <span class="comment">// PUBLIC INTERFACE</span>
<a name="l00069"></a>00069 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00070"></a>00070 <span class="comment"></span>
<a name="l00071"></a>00071 <span class="comment">/** Connects a client socket with a server.</span>
<a name="l00072"></a>00072 <span class="comment"></span>
<a name="l00073"></a>00073 <span class="comment">    @param [in]</span>
<a name="l00074"></a>00074 <span class="comment">    clientSocket : the client socket to be connected</span>
<a name="l00075"></a>00075 <span class="comment"></span>
<a name="l00076"></a>00076 <span class="comment">    @param [in]</span>
<a name="l00077"></a>00077 <span class="comment">    serverAddress : IP address of the server</span>
<a name="l00078"></a>00078 <span class="comment"></span>
<a name="l00079"></a>00079 <span class="comment">    @param [in]</span>
<a name="l00080"></a>00080 <span class="comment">    port : the port on which the server waits for connection requests</span>
<a name="l00081"></a>00081 <span class="comment"></span>
<a name="l00082"></a>00082 <span class="comment">    @return</span>
<a name="l00083"></a>00083 <span class="comment">    true if successful, false if not</span>
<a name="l00084"></a>00084 <span class="comment"></span>
<a name="l00085"></a>00085 <span class="comment">    @memberof Socket</span>
<a name="l00086"></a>00086 <span class="comment">*/</span>
<a name="l00087"></a>00087 
<a name="l00088"></a><a class="code" href="classSocket.html#a21a9ff688bda980aa3154c16069287f2">00088</a> TC2API <span class="keywordtype">bool</span> <a class="code" href="classSocket.html#a21a9ff688bda980aa3154c16069287f2" title="Connects a client socket with a server.">socket_connect</a>(<span class="keywordtype">int</span> <a class="code" href="classClient.html#adc5475d507e3d713ad405bbeb6eb41e7" title="The client socket.">clientSocket</a>, <a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a> <a class="code" href="classClient.html#a6dee50ddcd3fa9bd16c33ea160d15ae6" title="Default server IP address in binary (127.1).">serverAddress</a>, <a class="code" href="config_8h.html#ab95f123a6c9bcfee6a343170ef8c5f69" title="unsigned short abbreviation">ushort</a> port)
<a name="l00089"></a>00089 {
<a name="l00090"></a>00090    <span class="keyword">struct </span>sockaddr_in sin; <span class="comment">// server socket control structure </span>
<a name="l00091"></a>00091 
<a name="l00092"></a>00092    sin.sin_family = AF_INET;
<a name="l00093"></a>00093    sin.sin_addr.s_addr = serverAddress;
<a name="l00094"></a>00094    sin.sin_port = htons(port);
<a name="l00095"></a>00095 
<a name="l00096"></a>00096    <span class="keywordflow">return</span> (connect(clientSocket, (<span class="keyword">struct</span> sockaddr*)&amp;sin, <span class="keyword">sizeof</span>(sin)) == 0);
<a name="l00097"></a>00097 }
<a name="l00098"></a>00098 
<a name="l00099"></a>00099 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00100"></a>00100 <span class="comment">// PUBLIC INTERFACE</span>
<a name="l00101"></a>00101 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00102"></a>00102 <span class="comment"></span>
<a name="l00103"></a>00103 <span class="comment">/** Creates a client TCP socket.</span>
<a name="l00104"></a>00104 <span class="comment"></span>
<a name="l00105"></a>00105 <span class="comment">    @return</span>
<a name="l00106"></a>00106 <span class="comment">    clientSocket : a socket descriptor</span>
<a name="l00107"></a>00107 <span class="comment"></span>
<a name="l00108"></a>00108 <span class="comment">    @memberof Socket</span>
<a name="l00109"></a>00109 <span class="comment">*/</span>
<a name="l00110"></a>00110 
<a name="l00111"></a><a class="code" href="classSocket.html#a626d07f2d347c9695c03ee56d5abae57">00111</a> TC2API <span class="keywordtype">int</span> <a class="code" href="classSocket.html#a626d07f2d347c9695c03ee56d5abae57" title="Creates a client TCP socket.">socket_createClientSocket</a>(<span class="keywordtype">void</span>)
<a name="l00112"></a>00112 {
<a name="l00113"></a>00113    <span class="keywordtype">int</span> <a class="code" href="classClient.html#adc5475d507e3d713ad405bbeb6eb41e7" title="The client socket.">clientSocket</a>;
<a name="l00114"></a>00114 
<a name="l00115"></a>00115    <a class="code" href="Log_8h.html#aba64819ead3a2defc230ec7ccf655c4e" title="standard source file name for inclusion in log">log_func</a>(<a class="code" href="classSocket.html#a626d07f2d347c9695c03ee56d5abae57" title="Creates a client TCP socket.">socket_createClientSocket</a>);
<a name="l00116"></a>00116    <a class="code" href="Log_8h.html#a619ac1ab71ab5d1c7e94e03ddbf16d3b" title="log informational record with function identification (see Log::log_fheader)">log_finfo</a>(<span class="stringliteral">&quot;creating a client socket&quot;</span>);
<a name="l00117"></a>00117 
<a name="l00118"></a>00118    clientSocket = <a class="code" href="classSocket.html#aadd3e5b47036ac0ab8efe79b937146ca" title="Creates a TCP socket.">createTCPsocket</a>();
<a name="l00119"></a>00119 
<a name="l00120"></a>00120    <span class="keywordflow">return</span> clientSocket;
<a name="l00121"></a>00121 }
<a name="l00122"></a>00122 
<a name="l00123"></a>00123 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00124"></a>00124 <span class="comment">// PUBLIC INTERFACE</span>
<a name="l00125"></a>00125 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00126"></a>00126 <span class="comment"></span>
<a name="l00127"></a>00127 <span class="comment">/** Initializes the Socket class.</span>
<a name="l00128"></a>00128 <span class="comment">    @fn void socket_init(void)</span>
<a name="l00129"></a>00129 <span class="comment"></span>
<a name="l00130"></a>00130 <span class="comment">    Also, platform-specific initialization.</span>
<a name="l00131"></a>00131 <span class="comment"></span>
<a name="l00132"></a>00132 <span class="comment">    @memberof Socket</span>
<a name="l00133"></a>00133 <span class="comment">*/</span>
<a name="l00134"></a>00134 
<a name="l00135"></a>00135 <span class="preprocessor">#if PLATFORM(Linux)</span>
<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="classSocket.html#a8fe6ea62ef1e4d30acd1fadeaa3df74d" title="Initializes the Socket class.">socket_init</a>(<span class="keywordtype">void</span>)
<a name="l00137"></a>00137 {
<a name="l00138"></a>00138    <a class="code" href="Log_8h.html#aba64819ead3a2defc230ec7ccf655c4e" title="standard source file name for inclusion in log">log_func</a>(<a class="code" href="classSocket.html#a8fe6ea62ef1e4d30acd1fadeaa3df74d" title="Initializes the Socket class.">socket_init</a>);
<a name="l00139"></a>00139    <a class="code" href="Log_8h.html#a619ac1ab71ab5d1c7e94e03ddbf16d3b" title="log informational record with function identification (see Log::log_fheader)">log_finfo</a>(<span class="stringliteral">&quot;Socket class inicialization&quot;</span>);
<a name="l00140"></a>00140 
<a name="l00141"></a>00141    <span class="comment">// don&#39;t let the system abort the application when it tries to send bytes</span>
<a name="l00142"></a>00142    <span class="comment">// through a connection already closed by the client</span>
<a name="l00143"></a>00143    signal(SIGPIPE, SIG_IGN);
<a name="l00144"></a>00144 }
<a name="l00145"></a>00145 <span class="preprocessor">#endif</span>
<a name="l00146"></a>00146 <span class="preprocessor"></span>
<a name="l00147"></a>00147 <span class="preprocessor">#if PLATFORM(Windows)</span>
<a name="l00148"></a>00148 <span class="preprocessor"></span>TC2API <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a8fe6ea62ef1e4d30acd1fadeaa3df74d" title="Initializes the Socket class.">socket_init</a>(<span class="keywordtype">void</span>)
<a name="l00149"></a>00149 {
<a name="l00150"></a>00150    WSADATA wsaData;
<a name="l00151"></a>00151 
<a name="l00152"></a>00152    <a class="code" href="Log_8h.html#aba64819ead3a2defc230ec7ccf655c4e" title="standard source file name for inclusion in log">log_func</a>(<a class="code" href="classSocket.html#a8fe6ea62ef1e4d30acd1fadeaa3df74d" title="Initializes the Socket class.">socket_init</a>);
<a name="l00153"></a>00153    <a class="code" href="Log_8h.html#a619ac1ab71ab5d1c7e94e03ddbf16d3b" title="log informational record with function identification (see Log::log_fheader)">log_finfo</a>(<span class="stringliteral">&quot;Socket class inicialization&quot;</span>);
<a name="l00154"></a>00154 
<a name="l00155"></a>00155    <span class="comment">// mumbo-jumbo needed by Windows</span>
<a name="l00156"></a>00156    <span class="keywordflow">if</span> (WSAStartup(0x202, &amp;wsaData) == <a class="code" href="Socket_8h.html#a114f76181c8d260f8c67f73736a6f232" title="Generic Socket error definition.">E_SOCKET_ERROR</a>)
<a name="l00157"></a>00157    {
<a name="l00158"></a>00158       <span class="comment">// I guess there&#39;s nothing more we can do...</span>
<a name="l00159"></a>00159       <span class="keywordtype">int</span> err = socket_error();
<a name="l00160"></a>00160       <a class="code" href="Log_8h.html#a430b89fb69a94dd03ebd174fc7538218" title="log fatal error record with function identification (see Log::log_fheader)">log_ffatal</a>(<span class="stringliteral">&quot;error %d in WSAStartup&quot;</span>, err);
<a name="l00161"></a>00161       WSACleanup();
<a name="l00162"></a>00162       abort();
<a name="l00163"></a>00163    }
<a name="l00164"></a>00164 }
<a name="l00165"></a>00165 <span class="preprocessor">#endif</span>
<a name="l00166"></a>00166 <span class="preprocessor"></span>
<a name="l00167"></a>00167 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00168"></a>00168 <span class="comment">// PUBLIC INTERFACE</span>
<a name="l00169"></a>00169 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00170"></a>00170 <span class="comment"></span>
<a name="l00171"></a>00171 <span class="comment">/** Retrieves the partial number of bytes received up until a timeout.</span>
<a name="l00172"></a>00172 <span class="comment"></span>
<a name="l00173"></a>00173 <span class="comment">    @return</span>
<a name="l00174"></a>00174 <span class="comment">    the number of bytes received up until timeout occured</span>
<a name="l00175"></a>00175 <span class="comment"></span>
<a name="l00176"></a>00176 <span class="comment">    @memberof Socket</span>
<a name="l00177"></a>00177 <span class="comment">*/</span>
<a name="l00178"></a>00178 
<a name="l00179"></a><a class="code" href="classSocket.html#aa52c2cece2efbec8249847514a5c65fb">00179</a> TC2API <span class="keywordtype">int</span> <a class="code" href="classSocket.html#aa52c2cece2efbec8249847514a5c65fb" title="Retrieves the partial number of bytes received up until a timeout.">socket_partialLenReceived</a>(<span class="keywordtype">void</span>)
<a name="l00180"></a>00180 {
<a name="l00181"></a>00181    <span class="keywordflow">return</span> partialLenReceived;
<a name="l00182"></a>00182 }
<a name="l00183"></a>00183 
<a name="l00184"></a>00184 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00185"></a>00185 <span class="comment">// PUBLIC INTERFACE</span>
<a name="l00186"></a>00186 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00187"></a>00187 <span class="comment"></span>
<a name="l00188"></a>00188 <span class="comment">/** Receives an exact number of bytes from the peer application.</span>
<a name="l00189"></a>00189 <span class="comment"></span>
<a name="l00190"></a>00190 <span class="comment">    @param [in]</span>
<a name="l00191"></a>00191 <span class="comment">    socket : socket descritor</span>
<a name="l00192"></a>00192 <span class="comment"></span>
<a name="l00193"></a>00193 <span class="comment">    @param [out]</span>
<a name="l00194"></a>00194 <span class="comment">    buf : reception buffer</span>
<a name="l00195"></a>00195 <span class="comment"></span>
<a name="l00196"></a>00196 <span class="comment">    @param [in]</span>
<a name="l00197"></a>00197 <span class="comment">    len : number of bytes that &lt;i&gt; must &lt;/i&gt; be received in this call</span>
<a name="l00198"></a>00198 <span class="comment"></span>
<a name="l00199"></a>00199 <span class="comment">    @param [in]</span>
<a name="l00200"></a>00200 <span class="comment">    nSeconds : number of seconds in which the buffer &lt;i&gt; must &lt;/i&gt; arrive</span>
<a name="l00201"></a>00201 <span class="comment"></span>
<a name="l00202"></a>00202 <span class="comment">    @param [in]</span>
<a name="l00203"></a>00203 <span class="comment">    trace : whether to write a trace of the received bytes</span>
<a name="l00204"></a>00204 <span class="comment"></span>
<a name="l00205"></a>00205 <span class="comment">    @return</span>
<a name="l00206"></a>00206 <span class="comment">    number of bytes received, or 0 if connection closed, or -1 if error</span>
<a name="l00207"></a>00207 <span class="comment">    or -2 if timeout</span>
<a name="l00208"></a>00208 <span class="comment"></span>
<a name="l00209"></a>00209 <span class="comment">    @memberof Socket</span>
<a name="l00210"></a>00210 <span class="comment">*/</span>
<a name="l00211"></a>00211 
<a name="l00212"></a><a class="code" href="classSocket.html#adb0941e937d3c17ee2204586cae338c4">00212</a> TC2API <span class="keywordtype">int</span> <a class="code" href="classSocket.html#adb0941e937d3c17ee2204586cae338c4" title="Receives an exact number of bytes from the peer application.">socket_recvBuffer</a>(<span class="keywordtype">int</span> socket, <span class="keywordtype">char</span>* buf, <span class="keywordtype">int</span> len, <a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a> nSeconds,
<a name="l00213"></a>00213    <span class="keywordtype">bool</span> trace)
<a name="l00214"></a>00214 {
<a name="l00215"></a>00215    <a class="code" href="structTimeout.html" title="Structure representing timeout.">Timeout</a> timeout;
<a name="l00216"></a>00216    <span class="keywordtype">int</span> pendingLen = len;
<a name="l00217"></a>00217    <span class="keywordtype">int</span> nEvents, receivedLen = 0;
<a name="l00218"></a>00218 
<a name="l00219"></a>00219    <a class="code" href="structTimeout.html#a3c9170878cfae51d9dbf162d3fdcde55" title="Initializes a Timeout structure.">timeout_init</a>(&amp;timeout, nSeconds);
<a name="l00220"></a>00220 
<a name="l00221"></a>00221    <a class="code" href="classSocket.html#a9b4ecb9611c4a6b559c7383408bce343" title="Sets socket to nonblocking mode.">socket_setNonBlocking</a>(socket, <span class="keyword">true</span>);
<a name="l00222"></a>00222 
<a name="l00223"></a>00223    partialLenReceived = 0;
<a name="l00224"></a>00224 
<a name="l00225"></a>00225    <span class="comment">// while there&#39;s something to receive</span>
<a name="l00226"></a>00226    <span class="keywordflow">while</span> (pendingLen &gt; 0)
<a name="l00227"></a>00227    {
<a name="l00228"></a>00228       <span class="comment">// waits for some bytes to arrive</span>
<a name="l00229"></a>00229       nEvents = <a class="code" href="classSocket.html#a57c28e0df876528e9511a55e29f3bc00" title="Waits until there&amp;#39;s some bytes available to receive, or timeout occurs.">waitRecvEvent</a>(socket, <a class="code" href="structTimeout.html#ad51f4db38a6040f69a78634768ae4162" title="Queries remaining time (in seconds) in a Timeout structure.">timeout_remaining</a>(&amp;timeout));
<a name="l00230"></a>00230 
<a name="l00231"></a>00231       <span class="keywordflow">if</span> (nEvents == -1) <span class="comment">// error</span>
<a name="l00232"></a>00232       {
<a name="l00233"></a>00233          receivedLen = -1;
<a name="l00234"></a>00234          <span class="keywordflow">break</span>;
<a name="l00235"></a>00235       }
<a name="l00236"></a>00236 
<a name="l00237"></a>00237       <span class="keywordflow">if</span> (nEvents == 0)
<a name="l00238"></a>00238       {
<a name="l00239"></a>00239          receivedLen = <a class="code" href="Socket_8h.html#ad38171878628c67def4c5bca6a6caf76" title="Generic timeout Socket error.">E_SOCKET_TIMEOUT</a>; <span class="comment">// timeout </span>
<a name="l00240"></a>00240          <span class="keywordflow">break</span>;
<a name="l00241"></a>00241       }
<a name="l00242"></a>00242 
<a name="l00243"></a>00243       <span class="comment">// tries to receive the remaining data</span>
<a name="l00244"></a>00244       len = recv(socket, buf, pendingLen, 0);
<a name="l00245"></a>00245 
<a name="l00246"></a>00246       <span class="keywordflow">if</span> (len == 0)
<a name="l00247"></a>00247       {
<a name="l00248"></a>00248          receivedLen =  0; <span class="comment">// connection closed</span>
<a name="l00249"></a>00249          <span class="keywordflow">break</span>;
<a name="l00250"></a>00250       }
<a name="l00251"></a>00251 
<a name="l00252"></a>00252       <span class="keywordflow">if</span> (len &lt; 0) <span class="comment">// error ?</span>
<a name="l00253"></a>00253       {
<a name="l00254"></a>00254          <span class="keywordtype">int</span> err = socket_error();
<a name="l00255"></a>00255          <span class="keywordflow">if</span> (socket_shouldRetry(err) || socket_wouldBlock(err))
<a name="l00256"></a>00256             <span class="keywordflow">continue</span>;
<a name="l00257"></a>00257          receivedLen =  -1; <span class="comment">// error</span>
<a name="l00258"></a>00258          <span class="keywordflow">break</span>;
<a name="l00259"></a>00259       }
<a name="l00260"></a>00260 
<a name="l00261"></a>00261       <span class="comment">// ok, got &quot;len&quot; bytes</span>
<a name="l00262"></a>00262       <span class="keywordflow">if</span> (trace)
<a name="l00263"></a>00263       {
<a name="l00264"></a>00264          <a class="code" href="config_8h.html#ab95f123a6c9bcfee6a343170ef8c5f69" title="unsigned short abbreviation">ushort</a> port;
<a name="l00265"></a>00265          <span class="keyword">struct </span>sockaddr_in sa;
<a name="l00266"></a>00266          socklen_t addrlen = <span class="keyword">sizeof</span>(sa);
<a name="l00267"></a>00267          <span class="keywordtype">char</span> bufPort[50];
<a name="l00268"></a>00268          getsockname(socket, (<span class="keyword">struct</span> sockaddr*)&amp;sa, &amp;addrlen);
<a name="l00269"></a>00269          port = htons(sa.sin_port);
<a name="l00270"></a>00270          sprintf(bufPort, <span class="stringliteral">&quot;received in port:%d&quot;</span>, port);
<a name="l00271"></a>00271          <a class="code" href="Log_8h.html#a4a0ef902e85ad80fb25fae140d7dbf96" title="log trace record (see Log::log_writeTrace)">log_trace</a>(bufPort, buf, len);
<a name="l00272"></a>00272       }
<a name="l00273"></a>00273 
<a name="l00274"></a>00274       partialLenReceived += len; <span class="comment">// for use by GenericClient</span>
<a name="l00275"></a>00275 
<a name="l00276"></a>00276       pendingLen -= len;   <span class="comment">// adjusts pending len</span>
<a name="l00277"></a>00277       receivedLen += len;  <span class="comment">// adjusts received len so far</span>
<a name="l00278"></a>00278       buf += len;          <span class="comment">// advances reception buffer</span>
<a name="l00279"></a>00279 
<a name="l00280"></a>00280    } <span class="comment">// while</span>
<a name="l00281"></a>00281 
<a name="l00282"></a>00282    <a class="code" href="classSocket.html#a9b4ecb9611c4a6b559c7383408bce343" title="Sets socket to nonblocking mode.">socket_setNonBlocking</a>(socket, <span class="keyword">false</span>);
<a name="l00283"></a>00283    <span class="keywordflow">return</span> receivedLen;
<a name="l00284"></a>00284 }
<a name="l00285"></a>00285 
<a name="l00286"></a>00286 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00287"></a>00287 <span class="comment">// PUBLIC INTERFACE</span>
<a name="l00288"></a>00288 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00289"></a>00289 <span class="comment"></span>
<a name="l00290"></a>00290 <span class="comment">/** Sends  an exact number of bytes to the peer application.</span>
<a name="l00291"></a>00291 <span class="comment"></span>
<a name="l00292"></a>00292 <span class="comment">    @param [in]</span>
<a name="l00293"></a>00293 <span class="comment">    socket : socket descritor</span>
<a name="l00294"></a>00294 <span class="comment"></span>
<a name="l00295"></a>00295 <span class="comment">    @param [in]</span>
<a name="l00296"></a>00296 <span class="comment">    msgBuf : message buffer</span>
<a name="l00297"></a>00297 <span class="comment"></span>
<a name="l00298"></a>00298 <span class="comment">    @param [in]</span>
<a name="l00299"></a>00299 <span class="comment">    msgLen : number of bytes that &lt;i&gt; must &lt;/i&gt; be sent in this call</span>
<a name="l00300"></a>00300 <span class="comment"></span>
<a name="l00301"></a>00301 <span class="comment">    @param [in]</span>
<a name="l00302"></a>00302 <span class="comment">    nSeconds : number of seconds to conclude the operation</span>
<a name="l00303"></a>00303 <span class="comment"></span>
<a name="l00304"></a>00304 <span class="comment">    @param [in]</span>
<a name="l00305"></a>00305 <span class="comment">    trace : whether to write a trace of the bytes sent</span>
<a name="l00306"></a>00306 <span class="comment"></span>
<a name="l00307"></a>00307 <span class="comment">    @return</span>
<a name="l00308"></a>00308 <span class="comment">    number of bytes that were sent, or -1 if error, or -2 if timeout</span>
<a name="l00309"></a>00309 <span class="comment"></span>
<a name="l00310"></a>00310 <span class="comment">    @memberof Socket</span>
<a name="l00311"></a>00311 <span class="comment">*/</span>
<a name="l00312"></a>00312 
<a name="l00313"></a><a class="code" href="classSocket.html#a9b2b0db924dff614c6920af6b9879193">00313</a> TC2API <span class="keywordtype">int</span> <a class="code" href="classSocket.html#a9b2b0db924dff614c6920af6b9879193" title="Sends an exact number of bytes to the peer application.">socket_sendBuffer</a>(<span class="keywordtype">int</span> socket, <a class="code" href="config_8h.html#a0f128c3e0c83721af0220c00554e9c4e" title="const char abbreviation">cchar</a>* msgBuf, <span class="keywordtype">int</span> msgLen, <a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a> nSeconds,
<a name="l00314"></a>00314    <span class="keywordtype">bool</span> trace)
<a name="l00315"></a>00315 {
<a name="l00316"></a>00316    <a class="code" href="structTimeout.html" title="Structure representing timeout.">Timeout</a> timeout;
<a name="l00317"></a>00317    <span class="keywordtype">int</span> pendingLen = msgLen;
<a name="l00318"></a>00318    <span class="keywordtype">char</span>* buf = (<span class="keywordtype">char</span>*)msgBuf;
<a name="l00319"></a>00319 
<a name="l00320"></a>00320    <a class="code" href="structTimeout.html#a3c9170878cfae51d9dbf162d3fdcde55" title="Initializes a Timeout structure.">timeout_init</a>(&amp;timeout, nSeconds);
<a name="l00321"></a>00321 
<a name="l00322"></a>00322    <a class="code" href="classSocket.html#a9b4ecb9611c4a6b559c7383408bce343" title="Sets socket to nonblocking mode.">socket_setNonBlocking</a>(socket, <span class="keyword">true</span>);
<a name="l00323"></a>00323 
<a name="l00324"></a>00324    <span class="comment">// tries to send exactly &quot;msgLen&quot; bytes to peer</span>
<a name="l00325"></a>00325    <span class="keywordflow">while</span> (pendingLen &gt; 0)
<a name="l00326"></a>00326    {
<a name="l00327"></a>00327       <span class="keywordtype">int</span> partialLen;
<a name="l00328"></a>00328       <span class="keywordtype">int</span> nEvents = <a class="code" href="classSocket.html#afb85aa9647420dc41874760516f16f4d" title="Waits until it&amp;#39;s possible to send some bytes through the socket without blocking...">waitSendEvent</a>(socket, <a class="code" href="structTimeout.html#ad51f4db38a6040f69a78634768ae4162" title="Queries remaining time (in seconds) in a Timeout structure.">timeout_remaining</a>(&amp;timeout)); 
<a name="l00329"></a>00329 
<a name="l00330"></a>00330       <span class="keywordflow">if</span> (nEvents == -1) <span class="comment">// error</span>
<a name="l00331"></a>00331       {
<a name="l00332"></a>00332          msgLen = -1;
<a name="l00333"></a>00333          <span class="keywordflow">break</span>;
<a name="l00334"></a>00334       }
<a name="l00335"></a>00335 
<a name="l00336"></a>00336       <span class="keywordflow">if</span> (nEvents == 0)
<a name="l00337"></a>00337       {
<a name="l00338"></a>00338          msgLen = <a class="code" href="Socket_8h.html#ad38171878628c67def4c5bca6a6caf76" title="Generic timeout Socket error.">E_SOCKET_TIMEOUT</a>; <span class="comment">// timeout </span>
<a name="l00339"></a>00339          <span class="keywordflow">break</span>;
<a name="l00340"></a>00340       }
<a name="l00341"></a>00341 
<a name="l00342"></a>00342       <span class="comment">// tries to send the remaining data</span>
<a name="l00343"></a>00343       partialLen = send(socket, buf, pendingLen, 0);
<a name="l00344"></a>00344       <span class="keywordflow">if</span> (partialLen &lt; 0) <span class="comment">// error ?</span>
<a name="l00345"></a>00345       {
<a name="l00346"></a>00346          <span class="keywordtype">int</span> err = socket_error();
<a name="l00347"></a>00347          <span class="keywordflow">if</span> (socket_shouldRetry(err) || socket_wouldBlock(err))
<a name="l00348"></a>00348             <span class="keywordflow">continue</span>;
<a name="l00349"></a>00349          msgLen = -1; <span class="comment">// error</span>
<a name="l00350"></a>00350          <span class="keywordflow">break</span>;
<a name="l00351"></a>00351       }
<a name="l00352"></a>00352 
<a name="l00353"></a>00353       <span class="keywordflow">if</span> (trace)
<a name="l00354"></a>00354       {
<a name="l00355"></a>00355          <a class="code" href="config_8h.html#ab95f123a6c9bcfee6a343170ef8c5f69" title="unsigned short abbreviation">ushort</a> port;
<a name="l00356"></a>00356          <span class="keyword">struct </span>sockaddr_in sa;
<a name="l00357"></a>00357          socklen_t addrlen = <span class="keyword">sizeof</span>(sa);
<a name="l00358"></a>00358          <span class="keywordtype">char</span> bufPort[50];
<a name="l00359"></a>00359          getsockname(socket, (<span class="keyword">struct</span> sockaddr*)&amp;sa, &amp;addrlen);
<a name="l00360"></a>00360          port = htons(sa.sin_port);
<a name="l00361"></a>00361          sprintf(bufPort, <span class="stringliteral">&quot;sent from port:%d&quot;</span>, port);
<a name="l00362"></a>00362          <a class="code" href="Log_8h.html#a4a0ef902e85ad80fb25fae140d7dbf96" title="log trace record (see Log::log_writeTrace)">log_trace</a>(bufPort, buf, partialLen);
<a name="l00363"></a>00363       }
<a name="l00364"></a>00364       pendingLen -= partialLen;
<a name="l00365"></a>00365       buf += partialLen;
<a name="l00366"></a>00366    } <span class="comment">// while</span>
<a name="l00367"></a>00367 
<a name="l00368"></a>00368    <a class="code" href="classSocket.html#a9b4ecb9611c4a6b559c7383408bce343" title="Sets socket to nonblocking mode.">socket_setNonBlocking</a>(socket, <span class="keyword">false</span>);
<a name="l00369"></a>00369    <span class="keywordflow">return</span> msgLen;
<a name="l00370"></a>00370 }
<a name="l00371"></a>00371 
<a name="l00372"></a>00372 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00373"></a>00373 <span class="comment">// PUBLIC INTERFACE</span>
<a name="l00374"></a>00374 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00375"></a>00375 <span class="comment"></span>
<a name="l00376"></a>00376 <span class="comment">/** Sets socket to nonblocking mode.</span>
<a name="l00377"></a>00377 <span class="comment">    @fn void socket_setNonBlocking(int socket, bool nonBlocking)</span>
<a name="l00378"></a>00378 <span class="comment"></span>
<a name="l00379"></a>00379 <span class="comment">    @param [in]</span>
<a name="l00380"></a>00380 <span class="comment">    socket : descriptor of socket to be put in nonblocking mode</span>
<a name="l00381"></a>00381 <span class="comment"></span>
<a name="l00382"></a>00382 <span class="comment">    @param [in]</span>
<a name="l00383"></a>00383 <span class="comment">    nonBlocking : flag that says to enter or leave nonblocking mode</span>
<a name="l00384"></a>00384 <span class="comment"></span>
<a name="l00385"></a>00385 <span class="comment">    @post</span>
<a name="l00386"></a>00386 <span class="comment">    aborts application if not successful</span>
<a name="l00387"></a>00387 <span class="comment"></span>
<a name="l00388"></a>00388 <span class="comment">    @memberof Socket</span>
<a name="l00389"></a>00389 <span class="comment">*/</span>
<a name="l00390"></a>00390 
<a name="l00391"></a>00391 <span class="preprocessor">#if PLATFORM(Linux)</span>
<a name="l00392"></a>00392 <span class="preprocessor"></span>TC2API <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a9b4ecb9611c4a6b559c7383408bce343" title="Sets socket to nonblocking mode.">socket_setNonBlocking</a>(<span class="keywordtype">int</span> socket, <span class="keywordtype">bool</span> nonBlocking)
<a name="l00393"></a>00393 {
<a name="l00394"></a>00394    <span class="keywordtype">int</span> flags = fcntl(socket,F_GETFL,0);
<a name="l00395"></a>00395    <span class="keywordflow">if</span> (nonBlocking)
<a name="l00396"></a>00396       flags |= O_NONBLOCK;
<a name="l00397"></a>00397    <span class="keywordflow">else</span>
<a name="l00398"></a>00398       flags &amp;= ~O_NONBLOCK;
<a name="l00399"></a>00399    fcntl(socket, F_SETFL, flags);
<a name="l00400"></a>00400 }
<a name="l00401"></a>00401 <span class="preprocessor">#endif</span>
<a name="l00402"></a>00402 <span class="preprocessor"></span>
<a name="l00403"></a>00403 <span class="preprocessor">#if PLATFORM(Windows)</span>
<a name="l00404"></a>00404 <span class="preprocessor"></span>TC2API <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a9b4ecb9611c4a6b559c7383408bce343" title="Sets socket to nonblocking mode.">socket_setNonBlocking</a>(<span class="keywordtype">int</span> socket, <span class="keywordtype">bool</span> _mode)
<a name="l00405"></a>00405 {
<a name="l00406"></a>00406    <a class="code" href="config_8h.html#a718b4eb2652c286f4d42dc18a8e71a1a" title="unsigned long abbreviation">ulong</a> mode = _mode;
<a name="l00407"></a>00407    ioctlsocket(socket, FIONBIO, &amp;mode);
<a name="l00408"></a>00408 }
<a name="l00409"></a>00409 <span class="preprocessor">#endif</span>
<a name="l00410"></a>00410 <span class="preprocessor"></span>
<a name="l00411"></a>00411 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00412"></a>00412 <span class="comment"></span>
<a name="l00413"></a>00413 <span class="comment">/** Creates a TCP socket.</span>
<a name="l00414"></a>00414 <span class="comment"></span>
<a name="l00415"></a>00415 <span class="comment">    @return</span>
<a name="l00416"></a>00416 <span class="comment">    a TCP socket descriptor</span>
<a name="l00417"></a>00417 <span class="comment"></span>
<a name="l00418"></a>00418 <span class="comment">    @post</span>
<a name="l00419"></a>00419 <span class="comment">    Either succeeds or aborts application</span>
<a name="l00420"></a>00420 <span class="comment"></span>
<a name="l00421"></a>00421 <span class="comment">    @private @memberof Socket</span>
<a name="l00422"></a>00422 <span class="comment">*/</span>
<a name="l00423"></a>00423 
<a name="l00424"></a><a class="code" href="classSocket.html#aadd3e5b47036ac0ab8efe79b937146ca">00424</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="classSocket.html#aadd3e5b47036ac0ab8efe79b937146ca" title="Creates a TCP socket.">createTCPsocket</a>(<span class="keywordtype">void</span>)
<a name="l00425"></a>00425 {
<a name="l00426"></a>00426    <span class="keywordtype">int</span> tcpSocket;
<a name="l00427"></a>00427 
<a name="l00428"></a>00428    <a class="code" href="Log_8h.html#aba64819ead3a2defc230ec7ccf655c4e" title="standard source file name for inclusion in log">log_func</a>(<a class="code" href="classSocket.html#aadd3e5b47036ac0ab8efe79b937146ca" title="Creates a TCP socket.">createTCPsocket</a>);
<a name="l00429"></a>00429    <a class="code" href="Log_8h.html#a619ac1ab71ab5d1c7e94e03ddbf16d3b" title="log informational record with function identification (see Log::log_fheader)">log_finfo</a>(<span class="stringliteral">&quot;creating a TCP socket&quot;</span>);
<a name="l00430"></a>00430 
<a name="l00431"></a>00431    <span class="keywordflow">if</span> ((tcpSocket=socket(AF_INET, SOCK_STREAM, 0)) &lt; 0)
<a name="l00432"></a>00432    {
<a name="l00433"></a>00433       <span class="comment">// if we cannot create a socket there&#39;s something very wrong with the</span>
<a name="l00434"></a>00434       <span class="comment">// system, so we abort the application</span>
<a name="l00435"></a>00435       <span class="keywordtype">int</span> err = socket_error();
<a name="l00436"></a>00436       <a class="code" href="Log_8h.html#a430b89fb69a94dd03ebd174fc7538218" title="log fatal error record with function identification (see Log::log_fheader)">log_ffatal</a>(<span class="stringliteral">&quot;* error creating socket: %d&quot;</span>, err);
<a name="l00437"></a>00437       abort();
<a name="l00438"></a>00438    }
<a name="l00439"></a>00439 
<a name="l00440"></a>00440    <span class="keywordflow">return</span> tcpSocket;
<a name="l00441"></a>00441 }
<a name="l00442"></a>00442 
<a name="l00443"></a>00443 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00444"></a>00444 <span class="comment"></span>
<a name="l00445"></a>00445 <span class="comment">/** Waits until there&#39;s some bytes available to receive, or timeout occurs.</span>
<a name="l00446"></a>00446 <span class="comment"></span>
<a name="l00447"></a>00447 <span class="comment">    @param [in]</span>
<a name="l00448"></a>00448 <span class="comment">    socket : connected socket descriptor</span>
<a name="l00449"></a>00449 <span class="comment"></span>
<a name="l00450"></a>00450 <span class="comment">    @param [in]</span>
<a name="l00451"></a>00451 <span class="comment">    nSeconds : timeout to wait until some bytes are available</span>
<a name="l00452"></a>00452 <span class="comment"></span>
<a name="l00453"></a>00453 <span class="comment">    @return</span>
<a name="l00454"></a>00454 <span class="comment">    number of events available (-1, 0, 1)</span>
<a name="l00455"></a>00455 <span class="comment"></span>
<a name="l00456"></a>00456 <span class="comment">    @private @memberof Socket</span>
<a name="l00457"></a>00457 <span class="comment">*/</span>
<a name="l00458"></a>00458 
<a name="l00459"></a><a class="code" href="classSocket.html#a57c28e0df876528e9511a55e29f3bc00">00459</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="classSocket.html#a57c28e0df876528e9511a55e29f3bc00" title="Waits until there&amp;#39;s some bytes available to receive, or timeout occurs.">waitRecvEvent</a>(<span class="keywordtype">int</span> socket, <a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a> nSeconds)
<a name="l00460"></a>00460 {
<a name="l00461"></a>00461    fd_set readfds;
<a name="l00462"></a>00462    <span class="keyword">struct </span>timeval timeout = { nSeconds, 0 };
<a name="l00463"></a>00463    <span class="keyword">struct </span>timeval* pTimeout = (nSeconds == <a class="code" href="Timeout_8h.html#a3b78ef6eaf8bf61492b4f4d89bd5181c" title="No timeout.">TIMEOUT_WAIT_FOREVER</a>) ? NULL
<a name="l00464"></a>00464       : &amp;timeout;
<a name="l00465"></a>00465 
<a name="l00466"></a>00466    FD_ZERO(&amp;readfds);
<a name="l00467"></a>00467    FD_SET(socket,&amp;readfds);
<a name="l00468"></a>00468 
<a name="l00469"></a>00469    <span class="keywordflow">return</span> select(socket+1, &amp;readfds, NULL, NULL, pTimeout);
<a name="l00470"></a>00470 }
<a name="l00471"></a>00471 
<a name="l00472"></a>00472 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00473"></a>00473 <span class="comment"></span>
<a name="l00474"></a>00474 <span class="comment">/** Waits until it&#39;s possible to send some bytes through the socket without</span>
<a name="l00475"></a>00475 <span class="comment">    blocking.</span>
<a name="l00476"></a>00476 <span class="comment"></span>
<a name="l00477"></a>00477 <span class="comment">    @param [in]</span>
<a name="l00478"></a>00478 <span class="comment">    socket : connected socket descriptor</span>
<a name="l00479"></a>00479 <span class="comment"></span>
<a name="l00480"></a>00480 <span class="comment">    @param [in]</span>
<a name="l00481"></a>00481 <span class="comment">    nSeconds : timeout to wait until the send event occurs</span>
<a name="l00482"></a>00482 <span class="comment"></span>
<a name="l00483"></a>00483 <span class="comment">    @return</span>
<a name="l00484"></a>00484 <span class="comment">    number of events available (-1, 0, 1)</span>
<a name="l00485"></a>00485 <span class="comment"></span>
<a name="l00486"></a>00486 <span class="comment">    @private @memberof Socket</span>
<a name="l00487"></a>00487 <span class="comment">*/</span>
<a name="l00488"></a>00488 
<a name="l00489"></a><a class="code" href="classSocket.html#afb85aa9647420dc41874760516f16f4d">00489</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="classSocket.html#afb85aa9647420dc41874760516f16f4d" title="Waits until it&amp;#39;s possible to send some bytes through the socket without blocking...">waitSendEvent</a>(<span class="keywordtype">int</span> socket, <a class="code" href="config_8h.html#a91ad9478d81a7aaf2593e8d9c3d06a14" title="unsigned int abbreviation">uint</a> nSeconds)
<a name="l00490"></a>00490 {
<a name="l00491"></a>00491    fd_set writefds;
<a name="l00492"></a>00492    <span class="keyword">struct </span>timeval timeout = { nSeconds, 0 };
<a name="l00493"></a>00493    <span class="keyword">struct </span>timeval* pTimeout = (nSeconds == <a class="code" href="Timeout_8h.html#a3b78ef6eaf8bf61492b4f4d89bd5181c" title="No timeout.">TIMEOUT_WAIT_FOREVER</a>) ? NULL
<a name="l00494"></a>00494       : &amp;timeout;
<a name="l00495"></a>00495 
<a name="l00496"></a>00496    FD_ZERO(&amp;writefds);
<a name="l00497"></a>00497    FD_SET(socket,&amp;writefds);
<a name="l00498"></a>00498 
<a name="l00499"></a>00499    <span class="keywordflow">return</span> select(socket+1, NULL, &amp;writefds, NULL, pTimeout);
<a name="l00500"></a>00500 }
<a name="l00501"></a>00501 
<a name="l00502"></a>00502 <span class="comment">// -----------------------------------------------------------------------------</span>
<a name="l00503"></a>00503 <span class="comment">// the end</span>
</pre></div></div>
<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat May 8 16:16:36 2010 for TcpClient2 by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
</body>
</html>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
zvx
Software Developer
Brazil Brazil
I'm a long-time software developer living in Brazil.

I've been developing software for retail and banking automation in C/C++ for many years now. In the old days I even did some COBOL programming, and some assembly for the 8080.

My experience ranges from low level software such as interface code for serial devices for DOS and Windows (bar code scanners, printers, cash dispensers, etc) and goes to writing end user applications for POS terminals and bank ATMs. In between I've done a great deal of TCP/IP programming using the basic Berkeley sockets interface, which is my main interest nowadays.

Comments and Discussions