groupsock/NetInterface.cpp

Go to the documentation of this file.
00001 /**********
00002 This library is free software; you can redistribute it and/or modify it under
00003 the terms of the GNU Lesser General Public License as published by the
00004 Free Software Foundation; either version 2.1 of the License, or (at your
00005 option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
00006 
00007 This library is distributed in the hope that it will be useful, but WITHOUT
00008 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00009 FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
00010 more details.
00011 
00012 You should have received a copy of the GNU Lesser General Public License
00013 along with this library; if not, write to the Free Software Foundation, Inc.,
00014 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
00015 **********/
00016 // "mTunnel" multicast access service
00017 // Copyright (c) 1996-2008 Live Networks, Inc.  All rights reserved.
00018 // Network Interfaces
00019 // Implementation
00020 
00021 #include "NetInterface.hh"
00022 #include "GroupsockHelper.hh"
00023 
00024 #ifndef NO_STRSTREAM
00025 #if (defined(__WIN32__) || defined(_WIN32)) && !defined(__MINGW32__)
00026 #include <strstrea.h>
00027 #else
00028 #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
00029 #include <strstream>
00030 #else
00031 #include <strstream.h>
00032 #endif
00033 #endif
00034 #endif
00035 
00037 
00038 UsageEnvironment* NetInterface::DefaultUsageEnvironment = NULL;
00039 
00040 NetInterface::NetInterface() {
00041 }
00042 
00043 NetInterface::~NetInterface() {
00044 }
00045 
00046 
00048 
00049 DirectedNetInterface::DirectedNetInterface() {
00050 }
00051 
00052 DirectedNetInterface::~DirectedNetInterface() {
00053 }
00054 
00055 
00057 
00058 DirectedNetInterfaceSet::DirectedNetInterfaceSet()
00059         : fTable(HashTable::create(ONE_WORD_HASH_KEYS)) {
00060 }
00061 
00062 DirectedNetInterfaceSet::~DirectedNetInterfaceSet() {
00063         delete fTable;
00064 }
00065 
00066 DirectedNetInterface*
00067 DirectedNetInterfaceSet::Add(DirectedNetInterface const* interf) {
00068   return (DirectedNetInterface*) fTable->Add((char*)interf, (void*)interf);
00069 }
00070 
00071 Boolean
00072 DirectedNetInterfaceSet::Remove(DirectedNetInterface const* interf) {
00073   return fTable->Remove((char*)interf);
00074 }
00075 
00076 DirectedNetInterfaceSet::Iterator::
00077 Iterator(DirectedNetInterfaceSet& interfaces)
00078   : fIter(HashTable::Iterator::create(*(interfaces.fTable))) {
00079 }
00080 
00081 DirectedNetInterfaceSet::Iterator::~Iterator() {
00082   delete fIter;
00083 }
00084 
00085 DirectedNetInterface* DirectedNetInterfaceSet::Iterator::next() {
00086   char const* key; // dummy
00087   return (DirectedNetInterface*) fIter->next(key);
00088 };
00089 
00090 
00092 
00093 int Socket::DebugLevel = 1; // default value
00094 
00095 Socket::Socket(UsageEnvironment& env, Port port, Boolean setLoopback)
00096   : fEnv(DefaultUsageEnvironment != NULL ? *DefaultUsageEnvironment : env), fPort(port), fSetLoopback(setLoopback) {
00097   fSocketNum = setupDatagramSocket(fEnv, port, setLoopback);
00098 }
00099 
00100 Socket::~Socket() {
00101   closeSocket(fSocketNum);
00102 }
00103 
00104 Boolean Socket::changePort(Port newPort) {
00105   closeSocket(fSocketNum);
00106   fSocketNum = setupDatagramSocket(fEnv, newPort, fSetLoopback);
00107   return fSocketNum >= 0;
00108 }
00109 
00110 UsageEnvironment& operator<<(UsageEnvironment& s, const Socket& sock) {
00111         return s << timestampString() << " Socket(" << sock.socketNum() << ")";
00112 }
00113 
00115 
00116 SocketLookupTable::SocketLookupTable()
00117   : fTable(HashTable::create(ONE_WORD_HASH_KEYS)) {
00118 }
00119 
00120 SocketLookupTable::~SocketLookupTable() {
00121   delete fTable;
00122 }
00123 
00124 Socket* SocketLookupTable::Fetch(UsageEnvironment& env, Port port,
00125                                  Boolean& isNew) {
00126   isNew = False;
00127   Socket* sock;
00128   do {
00129     sock = (Socket*) fTable->Lookup((char*)(long)(port.num()));
00130     if (sock == NULL) { // we need to create one:
00131       sock = CreateNew(env, port);
00132       if (sock == NULL || sock->socketNum() < 0) break;
00133 
00134       fTable->Add((char*)(long)(port.num()), (void*)sock);
00135       isNew = True;
00136     }
00137 
00138     return sock;
00139   } while (0);
00140 
00141   delete sock;
00142   return NULL;
00143 }
00144 
00145 Boolean SocketLookupTable::Remove(Socket const* sock) {
00146   return fTable->Remove( (char*)(long)(sock->port().num()) );
00147 }
00148 
00150 
00151 NetInterfaceTrafficStats::NetInterfaceTrafficStats() {
00152   fTotNumPackets = fTotNumBytes = 0.0;
00153 }
00154 
00155 void NetInterfaceTrafficStats::countPacket(unsigned packetSize) {
00156   fTotNumPackets += 1.0;
00157   fTotNumBytes += packetSize;
00158 }
00159 
00160 Boolean NetInterfaceTrafficStats::haveSeenTraffic() const {
00161   return fTotNumPackets != 0.0;
00162 }

Generated on Tue Oct 7 15:38:08 2008 for live by  doxygen 1.5.2