connection_8c-source.html

来自「仿真人工智能是指用人工的方法和技术」· HTML 代码 · 共 276 行 · 第 1/2 页

HTML
276
字号
00156     <a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m0">socketfd</a> = -1; <font class="comment">// This also 'sets' isConnected() to false</font>00157   }00158 }00159 <a name="l00162"></a><a class="code" href="classConnection.html#a5">00162</a> <font class="keywordtype">bool</font> <a class="code" href="classConnection.html#a5">Connection::isConnected</a>(<font class="keywordtype">void</font>)<font class="keyword"> const</font>00163 <font class="keyword"></font>{00164   <font class="keywordflow">return</font>(<a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m0">socketfd</a> != -1);00165 }00166 <a name="l00172"></a><a class="code" href="classConnection.html#a7">00172</a> <font class="keywordtype">int</font> <a class="code" href="classConnection.html#a7">Connection::receiveMessage</a>( <font class="keywordtype">char</font> *msg, <font class="keywordtype">int</font> maxsize )00173 {00174 <font class="preprocessor">#ifdef Solaris</font>00175 <font class="preprocessor"></font>  <font class="keywordtype">int</font>       servlen;00176 <font class="preprocessor">#else</font>00177 <font class="preprocessor"></font>  socklen_t servlen ;00178 <font class="preprocessor">#endif</font>00179 <font class="preprocessor"></font>  <font class="keywordtype">int</font> n;00180   <font class="keyword">struct </font>sockaddr_in serv_addr ;00181 00182   servlen = <font class="keyword">sizeof</font>(serv_addr) ;00183 00184   <font class="comment">// receive message from server</font>00185   n = recvfrom(<a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m0">socketfd</a>, msg, maxsize, 0,00186                               (<font class="keyword">struct</font> sockaddr *)&amp;serv_addr, &amp;servlen);00187 00188   <font class="keywordflow">if</font>(n &lt; 0)                                   <font class="comment">// error</font>00189   {00190     <font class="keywordflow">if</font>( n == -1 &amp;&amp; errno == EWOULDBLOCK)00191     {00192       msg[0] = <font class="charliteral">'\0'</font> ;00193       <font class="keywordflow">return</font> 0 ;00194     }00195     <font class="keywordflow">else</font>00196       <font class="keywordflow">return</font> -1;00197   }00198   <font class="keywordflow">else</font>                                       <font class="comment">// succesfull, set new server info</font>00199   {                                          <font class="comment">// next message will go to there</font>00200     <a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m1">serv_addr</a>.sin_port = serv_addr.sin_port ;00201     msg[n] = <font class="charliteral">'\0'</font> ;00202 00203     <font class="keywordflow">return</font> ( n == 0 ) ? 0 : 1 ;00204   }00205 }00206 <a name="l00210"></a><a class="code" href="classConnection.html#a8">00210</a> <font class="keywordtype">bool</font> <a class="code" href="classConnection.html#a8">Connection::sendMessage</a>( <font class="keyword">const</font> <font class="keywordtype">char</font> *msg )00211 {00212   <font class="keywordtype">int</font> n;00213 00214   n = strlen(msg) ;00215   <font class="keywordflow">if</font>( sendto(<a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m0">socketfd</a>, msg, n, 0,00216       (<font class="keyword">struct</font> sockaddr *)&amp;<a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m1">serv_addr</a>, <font class="keyword">sizeof</font>(<a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m1">serv_addr</a>)) != n )00217     <font class="keywordflow">return</font> <font class="keyword">false</font> ;00218   <font class="keywordflow">return</font> <font class="keyword">true</font> ;00219 }00220 <a name="l00227"></a><a class="code" href="classConnection.html#a6">00227</a> <font class="keywordtype">int</font> <a class="code" href="classConnection.html#a6">Connection::message_loop</a>( FILE *fpin, FILE *fpout )00228 {00229   fd_set readfds, readfds_bak;00230   <font class="keywordtype">int</font> in, max_fd, n, ret;00231   <font class="keywordtype">char</font> buf[<a class="code" href="classConnection.html#o1">m_iMaxMsgSize</a>];00232 00233   in = fileno( fpin );00234   FD_ZERO( &amp;readfds );00235   FD_SET( in, &amp;readfds );00236   readfds_bak = readfds;00237   max_fd = ((in &gt; <a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m0">socketfd</a>) ? in : <a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m0">socketfd</a>) = 1;00238 00239   <font class="keywordflow">while</font>( 1 )00240   {00241     readfds = readfds_bak;00242     <font class="comment">// wait for message from socket or fpin</font>00243     <font class="keywordflow">if</font>(( ret = select( max_fd, &amp;readfds, NULL, NULL, NULL )) &lt; 0 )00244     {00245       perror(<font class="stringliteral">"select"</font>);00246       <font class="keywordflow">break</font>;00247     }00248     <font class="keywordflow">else</font> <font class="keywordflow">if</font>( ret != 0 )00249     {00250       <font class="keywordflow">if</font>( FD_ISSET(in, &amp;readfds))              <font class="comment">// file descriptor fpin was set</font>00251       {00252         fgets(buf, <a class="code" href="classConnection.html#o1">m_iMaxMsgSize</a>, fpin);             <font class="comment">// get the message</font>00253         <font class="keywordflow">if</font>( <a class="code" href="classConnection.html#a8">sendMessage</a>(buf ) == <font class="keyword">false</font> )       <font class="comment">// and send it</font>00254           <font class="keywordflow">break</font>;00255       }00256       <font class="keywordflow">if</font>( FD_ISSET(<a class="code" href="classConnection.html#o0">m_sock</a>.<a class="code" href="struct__socket.html#m0">socketfd</a>, &amp;readfds ) ) <font class="comment">// file descriptor socket was set</font>00257       {00258         n = <a class="code" href="classConnection.html#a7">receiveMessage</a>(buf, <a class="code" href="classConnection.html#o1">m_iMaxMsgSize</a>);      <font class="comment">// receive the message</font>00259         <font class="keywordflow">if</font>( n == -1 )00260           <font class="keywordflow">break</font>;00261         <font class="keywordflow">else</font> <font class="keywordflow">if</font>( n &gt; 0 )                       <font class="comment">// and put it to fpout</font>00262         {00263           fputs(buf, fpout);00264           fputc( <font class="charliteral">'\n'</font>, fpout);00265         }00266         fflush(stdout);00267       }00268     }00269   }00270   <font class="keywordflow">return</font> 0;00271 }00272 00273 <a name="l00276"></a><a class="code" href="classConnection.html#a9">00276</a> <font class="keywordtype">void</font> <a class="code" href="classConnection.html#a9">Connection::show</a>( ostream os )00277 {00278   <font class="keywordflow">if</font>( ! <a class="code" href="classConnection.html#a5">isConnected</a>() )00279     os &lt;&lt; <font class="stringliteral">"Not connected"</font> &lt;&lt; endl;00280   <font class="keywordflow">else</font>00281     os &lt;&lt; <font class="stringliteral">"Connected"</font> &lt;&lt; endl;00282 00283 }00284 00285 <font class="comment">/********************** TESTING PURPOSES **************************************/</font>00286 00287 <font class="comment">/*</font>00288 <font class="comment">int main( void )</font>00289 <font class="comment">{</font>00290 <font class="comment">  char strBuf[m_iMaxMsgSize];</font>00291 <font class="comment">  Connection c( "localhost", 6000 );</font>00292 <font class="comment">  int i;</font>00293 <font class="comment">  c.sendMessage( "(init l (version 6.07))" );</font>00294 <font class="comment">  while( 1 )</font>00295 <font class="comment">  {</font>00296 <font class="comment">    i = c.receiveMessage( strBuf, m_iMaxMsgSize );</font>00297 <font class="comment">    printf("%d|%s|\n", i, strBuf );</font>00298 <font class="comment">  }</font>00299 <font class="comment">  return 0;</font>00300 <font class="comment">}</font>00301 <font class="comment">*/</font>00302 00303 </pre></div><hr><address><small>Generated on Thu Mar 7 00:37:42 2002 for UvA Trilearn 2001 by<a href="http://www.doxygen.org/index.html"><img src="doxygen.gif" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.12 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, &copy;&nbsp;1997-2001</small></address></body></html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?