TInetAddress.cxx

Go to the documentation of this file.
00001 // @(#)root/base:$Id: TInetAddress.cxx 31825 2009-12-10 20:16:27Z pcanal $
00002 // Author: Fons Rademakers   16/12/96
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //////////////////////////////////////////////////////////////////////////
00013 //                                                                      //
00014 // TInetAddress                                                         //
00015 //                                                                      //
00016 // This class represents an Internet Protocol (IP) address.             //
00017 //                                                                      //
00018 //////////////////////////////////////////////////////////////////////////
00019 
00020 #include "TInetAddress.h"
00021 #include "TClass.h"
00022 
00023 ClassImp(TInetAddress)
00024 
00025 //______________________________________________________________________________
00026 TInetAddress::TInetAddress()
00027 {
00028    // Default ctor. Used in case of unknown host. Not a valid address.
00029 
00030    fHostname  = "UnknownHost";
00031    AddAddress(0);
00032    fFamily    = -1;
00033    fPort      = -1;
00034 }
00035 
00036 //______________________________________________________________________________
00037 TInetAddress::TInetAddress(const char *host, UInt_t addr, Int_t family, Int_t port)
00038 {
00039    // Create TInetAddress. Private ctor. TInetAddress objects can only
00040    // be created via the friend classes TSystem, TServerSocket and TSocket.
00041    // Use the IsValid() method to check the validity of a TInetAddress.
00042 
00043    AddAddress(addr);
00044    if (!strcmp(host, "????") || !strcmp(host, "UnNamedHost"))
00045       fHostname = GetHostAddress();
00046    else
00047       fHostname = host;
00048    fFamily    = family;
00049    fPort      = port;
00050 }
00051 
00052 //______________________________________________________________________________
00053 TInetAddress::TInetAddress(const TInetAddress &adr) : TObject(adr)
00054 {
00055    // TInetAddress copy ctor.
00056 
00057    fHostname  = adr.fHostname;
00058    fFamily    = adr.fFamily;
00059    fPort      = adr.fPort;
00060    fAddresses = adr.fAddresses;
00061    fAliases   = adr.fAliases;
00062 }
00063 
00064 //______________________________________________________________________________
00065 TInetAddress& TInetAddress::operator=(const TInetAddress &rhs)
00066 {
00067    // TInetAddress assignment operator.
00068 
00069    if (this != &rhs) {
00070       TObject::operator=(rhs);
00071       fHostname  = rhs.fHostname;
00072       fFamily    = rhs.fFamily;
00073       fPort      = rhs.fPort;
00074       fAddresses = rhs.fAddresses;
00075       fAliases   = rhs.fAliases;
00076    }
00077    return *this;
00078 }
00079 
00080 //______________________________________________________________________________
00081 UChar_t *TInetAddress::GetAddressBytes() const
00082 {
00083    // Returns the raw IP address in host byte order. The highest
00084    // order byte position is in addr[0]. To be prepared for 64-bit
00085    // IP addresses an array of bytes is returned.
00086    // User must delete allocated memory.
00087 
00088    UChar_t *addr = new UChar_t[4];
00089 
00090    addr[0] = (UChar_t) ((fAddresses[0] >> 24) & 0xFF);
00091    addr[1] = (UChar_t) ((fAddresses[0] >> 16) & 0xFF);
00092    addr[2] = (UChar_t) ((fAddresses[0] >> 8) & 0xFF);
00093    addr[3] = (UChar_t)  (fAddresses[0] & 0xFF);
00094 
00095    return addr;
00096 }
00097 
00098 //______________________________________________________________________________
00099 const char *TInetAddress::GetHostAddress(UInt_t addr)
00100 {
00101    // Returns the IP address string "%d.%d.%d.%d", use it to convert
00102    // alternative addresses obtained via GetAddresses().
00103    // Copy string immediately, it will be reused. Static function.
00104 
00105    return Form("%d.%d.%d.%d", (addr >> 24) & 0xFF,
00106                               (addr >> 16) & 0xFF,
00107                               (addr >>  8) & 0xFF,
00108                                addr & 0xFF);
00109 }
00110 
00111 //______________________________________________________________________________
00112 const char *TInetAddress::GetHostAddress() const
00113 {
00114    // Returns the IP address string "%d.%d.%d.%d".
00115    // Copy string immediately, it will be reused.
00116 
00117    return GetHostAddress(fAddresses[0]);
00118 }
00119 
00120 //______________________________________________________________________________
00121 void TInetAddress::Print(Option_t *) const
00122 {
00123    // Print internet address as string.
00124 
00125    if (fPort == -1)
00126       Printf("%s/%s (not connected)", GetHostName(), GetHostAddress());
00127    else
00128       Printf("%s/%s (port %d)", GetHostName(), GetHostAddress(), fPort);
00129 
00130    int i = 0;
00131    AddressList_t::const_iterator ai;
00132    for (ai = fAddresses.begin(); ai != fAddresses.end(); ai++) {
00133       if (!i) printf("%s:", fAddresses.size() == 1 ? "Address" : "Addresses");
00134       printf(" %s", GetHostAddress(*ai));
00135       i++;
00136    }
00137    if (i) printf("\n");
00138 
00139    i = 0;
00140    AliasList_t::const_iterator ali;
00141    for (ali = fAliases.begin(); ali != fAliases.end(); ali++) {
00142       if (!i) printf("%s:", fAliases.size() == 1 ? "Alias" : "Aliases");
00143       printf(" %s", ali->Data());
00144       i++;
00145    }
00146    if (i) printf("\n");
00147 }
00148 
00149 //______________________________________________________________________________
00150 void TInetAddress::AddAddress(UInt_t addr)
00151 {
00152    // Add alternative address to list of addresses.
00153 
00154    fAddresses.push_back(addr);
00155 }
00156 
00157 //______________________________________________________________________________
00158 void TInetAddress::AddAlias(const char *alias)
00159 {
00160    // Add alias to list of aliases.
00161 
00162    fAliases.push_back(TString(alias));
00163 }
00164 
00165 //______________________________________________________________________________
00166 void TInetAddress::Streamer(TBuffer &R__b)
00167 {
00168    // Stream an object of class TInetAddress.
00169 
00170    if (R__b.IsReading()) {
00171       UInt_t R__s, R__c;
00172       Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
00173       if (R__v > 2) {
00174          R__b.ReadClassBuffer(TInetAddress::Class(), this, R__v, R__s, R__c);
00175          return;
00176       }
00177       // process old versions before automatic schema evolution
00178       UInt_t address;
00179       TObject::Streamer(R__b);
00180       fHostname.Streamer(R__b);
00181       R__b >> address;
00182       R__b >> fFamily;
00183       R__b >> fPort;
00184       if (R__v == 1)
00185          fAddresses.push_back(address);
00186       if (R__v > 1) {
00187          TInetAddress::AddressList_t &R__stl1 =  fAddresses;
00188          R__stl1.clear();
00189          int R__i, R__n;
00190          R__b >> R__n;
00191          R__stl1.reserve(R__n);
00192          for (R__i = 0; R__i < R__n; R__i++) {
00193             unsigned int R__t1;
00194             R__b >> R__t1;
00195             R__stl1.push_back(R__t1);
00196          }
00197          TInetAddress::AliasList_t &R__stl2 =  fAliases;
00198          R__stl2.clear();
00199          R__b >> R__n;
00200          R__stl2.reserve(R__n);
00201          for (R__i = 0; R__i < R__n; R__i++) {
00202             TString R__t2;
00203             R__t2.Streamer(R__b);
00204             R__stl2.push_back(R__t2);
00205          }
00206       }
00207       R__b.CheckByteCount(R__s, R__c, TInetAddress::IsA());
00208    } else {
00209       R__b.WriteClassBuffer(TInetAddress::Class(), this);
00210    }
00211 }

Generated on Tue Jul 5 14:11:21 2011 for ROOT_528-00b_version by  doxygen 1.5.1