X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fio%2Fsg_socket.cxx;h=4ca13150170e6bfba5eb052c8115ce6e85b1f668;hb=598b64fa9569c16878c904e344e2e2775e210c42;hp=20238727c3373e96706386f2ab15e75f1fa05941;hpb=ce5d4b7db84698ecb337afca05aac0b149e6e19b;p=simgear.git diff --git a/simgear/io/sg_socket.cxx b/simgear/io/sg_socket.cxx index 20238727..4ca13150 100644 --- a/simgear/io/sg_socket.cxx +++ b/simgear/io/sg_socket.cxx @@ -3,7 +3,7 @@ // Written by Curtis Olson, started November 1999. // Modified by Bernie Bright , May 2002. // -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -17,22 +17,26 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ +#ifdef HAVE_CONFIG_H +# include +#endif #include -#if defined( sgi ) -#include -#endif +#include +#include +#include // for atoi #include #include "sg_socket.hxx" bool SGSocket::init = false; +using std::string; SGSocket::SGSocket( const string& host, const string& port_, const string& style ) : @@ -42,19 +46,20 @@ SGSocket::SGSocket( const string& host, const string& port_, client(0), is_tcp(false), is_server(false), - first_read(false) + first_read(false), + timeout(0) { if (!init) { - netInit(NULL, NULL); // plib-1.4.2 compatible - init = true; + simgear::Socket::initSockets(); + init = true; } if ( style == "tcp" ) { is_tcp = true; } - else if ( style != (string)"udp" ) + else if ( style != "udp" ) { SG_LOG( SG_IO, SG_ALERT, "Error: SGSocket() unknown style = " << style ); @@ -80,7 +85,7 @@ SGSocket::make_server_socket() return false; } - if (sock.bind( "", port ) < 0) + if (sock.bind( hostname.c_str(), port ) < 0) { SG_LOG( SG_IO, SG_ALERT, "Error: bind() failed in make_server_socket()" ); @@ -218,7 +223,14 @@ SGSocket::read( char *buf, int length ) if (result > 0) { - result = sock.recv( buf, length ); + if (is_tcp && is_server) + { + result = client->recv( buf, length ); + } + else + { + result = sock.recv( buf, length ); + } if ( result != length ) { @@ -250,7 +262,7 @@ SGSocket::readline( char *buf, int length ) // read a chunk, keep in the save buffer until we have the // requested amount read - if (is_tcp) + if (is_tcp && is_server) { char *buf_ptr = save_buf + save_len; result = client->recv( buf_ptr, SG_IO_MAX_MSG_SIZE - save_len ); @@ -285,7 +297,7 @@ SGSocket::readline( char *buf, int length ) int i; for ( i = 0; i < save_len && save_buf[i] != '\n'; ++i ) ; - if ( save_buf[i] == '\n' ) { + if (( i < save_len ) && ( save_buf[i] == '\n' )) { result = i + 1; } else { // no end of line yet @@ -294,9 +306,16 @@ SGSocket::readline( char *buf, int length ) // we found an end of line + // check buffer size + int copy_length = result; + if (copy_length >= length) { + SG_LOG( SG_IO, SG_ALERT, + "Alert: readline() has line exceeding the buffer size." ); + copy_length = length-1; + } // copy to external buffer - strncpy( buf, save_buf, result ); - buf[result] = '\0'; + strncpy( buf, save_buf, copy_length ); + buf[copy_length] = '\0'; // shift save buffer //memmove( save_buf+, save_buf+, ? ); @@ -313,7 +332,7 @@ SGSocket::readline( char *buf, int length ) int SGSocket::write( const char *buf, const int length ) { - netSocket* s = client == 0 ? &sock : client; + simgear::Socket* s = client == 0 ? &sock : client; if (s->getHandle() == -1) { return 0; @@ -323,7 +342,7 @@ SGSocket::write( const char *buf, const int length ) if ( s->send( buf, length ) < 0 ) { - SG_LOG( SG_IO, SG_ALERT, "Error writing to socket: " << port ); + SG_LOG( SG_IO, SG_WARN, "Error writing to socket: " << port ); error_condition = true; } @@ -371,24 +390,24 @@ SGSocket::nonblock() int SGSocket::poll() { - netSocket* readers[2]; + simgear::Socket* readers[2]; readers[0] = client != 0 ? client : &sock; readers[1] = 0; - netSocket* writers[1]; + simgear::Socket* writers[1]; writers[0] = 0; - int result = netSocket::select( readers, writers, 0 ); + int result = simgear::Socket::select( readers, writers, timeout ); if (result > 0 && is_server && client == 0) { // Accept a new client connection - netAddress addr; + simgear::IPAddress addr; int new_fd = sock.accept( &addr ); SG_LOG( SG_IO, SG_INFO, "Accepted connection from " << addr.getHost() << ":" << addr.getPort() ); - client = new netSocket(); + client = new simgear::Socket(); client->setHandle( new_fd ); return 0; }