Socket.cc

Go to the documentation of this file.
00001 // Socket.cc
00002 
00003 // This file is part of bes, A C++ back-end server implementation framework
00004 // for the OPeNDAP Data Access Protocol.
00005 
00006 // Copyright (c) 2004-2009 University Corporation for Atmospheric Research
00007 // Author: Patrick West <pwest@ucar.edu> and Jose Garcia <jgarcia@ucar.edu>
00008 //
00009 // This library is free software; you can redistribute it and/or
00010 // modify it under the terms of the GNU Lesser General Public
00011 // License as published by the Free Software Foundation; either
00012 // version 2.1 of the License, or (at your option) any later version.
00013 // 
00014 // This library is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017 // Lesser General Public License for more details.
00018 // 
00019 // You should have received a copy of the GNU Lesser General Public
00020 // License along with this library; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 //
00023 // You can contact University Corporation for Atmospheric Research at
00024 // 3080 Center Green Drive, Boulder, CO 80301
00025  
00026 // (c) COPYRIGHT University Corporation for Atmospheric Research 2004-2005
00027 // Please read the full copyright statement in the file COPYRIGHT_UCAR.
00028 //
00029 // Authors:
00030 //      pwest       Patrick West <pwest@ucar.edu>
00031 //      jgarcia     Jose Garcia <jgarcia@ucar.edu>
00032 
00033 #include "config.h"
00034 
00035 #include <cerrno>
00036 #include <cstring>
00037 
00038 #ifdef HAVE_UNISTD_H
00039 #include <unistd.h>
00040 #endif
00041 
00042 #include <sys/types.h>
00043 #include <sys/socket.h>
00044 #include <arpa/inet.h>
00045 #ifdef HAVE_UNISTD_H
00046 #include <unistd.h>
00047 #endif
00048 #include <stdio.h>
00049 
00050 #include "Socket.h"
00051 #include "BESInternalError.h"
00052 
00053 Socket::Socket( int socket, struct sockaddr *addr )
00054     : _socket( socket ),
00055       _connected( true ),
00056       _listening( false ),
00057       _addr_set( true )
00058 {
00059     char ip[46];
00060     unsigned int port;
00061     /* ... */
00062     switch (addr->sa_family) {
00063         case AF_INET:
00064             inet_ntop (AF_INET, &(((struct sockaddr_in *)addr)->sin_addr), ip, sizeof (ip));
00065             port = ntohs (((struct sockaddr_in *)addr)->sin_port);
00066             break;
00067         case AF_INET6:
00068             inet_ntop (AF_INET6, &(((struct sockaddr_in6 *)addr)->sin6_addr), ip, sizeof (ip));
00069             port = ntohs (((struct sockaddr_in6 *)addr)->sin6_port);
00070             break;
00071         default:
00072             snprintf (ip, sizeof (ip), "UNKNOWN FAMILY: %d", addr->sa_family);
00073             port = 0;
00074             break;
00075     }
00076     _port = port ;
00077     _ip = ip ;
00078 }
00079 
00080 void
00081 Socket::close()
00082 {
00083     if( _connected )
00084     {
00085         ::close( _socket ) ;
00086         _socket = 0 ;
00087         _connected = false ;
00088         _listening = false ;
00089     }
00090 }
00091 
00092 void
00093 Socket::send( const string &str, int start, int end )
00094 {
00095     string send_str = str.substr( start, end ) ;
00096     int bytes_written = write( _socket, send_str.c_str(), send_str.length() ) ;
00097     if( bytes_written == -1 )
00098     {
00099         string err( "socket failure, writing on stream socket" ) ;
00100         const char* error_info = strerror( errno ) ;
00101         if( error_info )
00102             err += " " + (string)error_info ;
00103         throw BESInternalError( err, __FILE__, __LINE__ ) ;
00104     }
00105 }
00106 
00107 int     
00108 Socket::receive( char *inBuff, int inSize )
00109 {
00110     int bytesRead = 0 ;
00111     if( ( bytesRead = read( _socket, inBuff, inSize ) ) < 1 )
00112     {
00113         string err( "socket failure, reading on stream socket: " ) ;
00114         const char *error_info = strerror( errno ) ;
00115         if( error_info )
00116             err += " " + (string)error_info ;
00117         throw BESInternalError( err, __FILE__, __LINE__ ) ;
00118     }
00119     inBuff[bytesRead] = '\0' ;
00120     return bytesRead ;
00121 }
00122 
00123 void
00124 Socket::sync()
00125 {
00126     fsync( _socket ) ;
00127 }
00128 
00135 void
00136 Socket::dump( ostream &strm ) const
00137 {
00138     strm << BESIndent::LMarg << "Socket::dump - ("
00139                              << (void *)this << ")" << endl ;
00140     BESIndent::Indent() ;
00141     strm << BESIndent::LMarg << "socket: " << _socket << endl ;
00142     strm << BESIndent::LMarg << "is connected? " << _connected << endl ;
00143     strm << BESIndent::LMarg << "is listening? " << _listening << endl ;
00144     strm << BESIndent::LMarg << "socket address set? " << _addr_set << endl ;
00145     if( _addr_set )
00146     {
00147         strm << BESIndent::LMarg << "socket port: " << _port << endl;
00148         strm << BESIndent::LMarg << "socket ip: " << _ip << endl;
00149     }
00150     BESIndent::UnIndent() ;
00151 }
00152 

Generated on Sat Aug 22 06:06:27 2009 for OPeNDAP Hyrax Back End Server (BES) by  doxygen 1.6.0