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 *)&serv_addr, &servlen);00187 00188 <font class="keywordflow">if</font>(n < 0) <font class="comment">// error</font>00189 {00190 <font class="keywordflow">if</font>( n == -1 && 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 *)&<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( &readfds );00235 FD_SET( in, &readfds );00236 readfds_bak = readfds;00237 max_fd = ((in > <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, &readfds, NULL, NULL, NULL )) < 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, &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>, &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 > 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 << <font class="stringliteral">"Not connected"</font> << endl;00280 <font class="keywordflow">else</font>00281 os << <font class="stringliteral">"Connected"</font> << 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>, © 1997-2001</small></address></body></html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?