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-2013 Live Networks, Inc.  All rights reserved.
00018 // Network Interfaces
00019 // Implementation
00020 
00021 #include "NetInterface.hh"
00022 #include "GroupsockHelper.hh"
00023 
00024 #ifndef NO_SSTREAM
00025 #include <sstream>
00026 #endif
00027 #include <stdio.h>
00028 
00030 
00031 UsageEnvironment* NetInterface::DefaultUsageEnvironment = NULL;
00032 
00033 NetInterface::NetInterface() {
00034 }
00035 
00036 NetInterface::~NetInterface() {
00037 }
00038 
00039 
00041 
00042 DirectedNetInterface::DirectedNetInterface() {
00043 }
00044 
00045 DirectedNetInterface::~DirectedNetInterface() {
00046 }
00047 
00048 
00050 
00051 DirectedNetInterfaceSet::DirectedNetInterfaceSet()
00052         : fTable(HashTable::create(ONE_WORD_HASH_KEYS)) {
00053 }
00054 
00055 DirectedNetInterfaceSet::~DirectedNetInterfaceSet() {
00056         delete fTable;
00057 }
00058 
00059 DirectedNetInterface*
00060 DirectedNetInterfaceSet::Add(DirectedNetInterface const* interf) {
00061   return (DirectedNetInterface*) fTable->Add((char*)interf, (void*)interf);
00062 }
00063 
00064 Boolean
00065 DirectedNetInterfaceSet::Remove(DirectedNetInterface const* interf) {
00066   return fTable->Remove((char*)interf);
00067 }
00068 
00069 DirectedNetInterfaceSet::Iterator::
00070 Iterator(DirectedNetInterfaceSet& interfaces)
00071   : fIter(HashTable::Iterator::create(*(interfaces.fTable))) {
00072 }
00073 
00074 DirectedNetInterfaceSet::Iterator::~Iterator() {
00075   delete fIter;
00076 }
00077 
00078 DirectedNetInterface* DirectedNetInterfaceSet::Iterator::next() {
00079   char const* key; // dummy
00080   return (DirectedNetInterface*) fIter->next(key);
00081 };
00082 
00083 
00085 
00086 int Socket::DebugLevel = 1; // default value
00087 
00088 Socket::Socket(UsageEnvironment& env, Port port)
00089   : fEnv(DefaultUsageEnvironment != NULL ? *DefaultUsageEnvironment : env), fPort(port) {
00090   fSocketNum = setupDatagramSocket(fEnv, port);
00091 }
00092 
00093 Socket::~Socket() {
00094   closeSocket(fSocketNum);
00095 }
00096 
00097 Boolean Socket::changePort(Port newPort) {
00098   int oldSocketNum = fSocketNum;
00099   closeSocket(fSocketNum);
00100   fSocketNum = setupDatagramSocket(fEnv, newPort);
00101   if (fSocketNum < 0) {
00102     fEnv.taskScheduler().turnOffBackgroundReadHandling(oldSocketNum);
00103     return False;
00104   }
00105 
00106   if (fSocketNum != oldSocketNum) { // the socket number has changed, so move any event handling for it:
00107     fEnv.taskScheduler().moveSocketHandling(oldSocketNum, fSocketNum);
00108   }
00109   return True;
00110 }
00111 
00112 UsageEnvironment& operator<<(UsageEnvironment& s, const Socket& sock) {
00113         return s << timestampString() << " Socket(" << sock.socketNum() << ")";
00114 }
00115 
00117 
00118 SocketLookupTable::SocketLookupTable()
00119   : fTable(HashTable::create(ONE_WORD_HASH_KEYS)) {
00120 }
00121 
00122 SocketLookupTable::~SocketLookupTable() {
00123   delete fTable;
00124 }
00125 
00126 Socket* SocketLookupTable::Fetch(UsageEnvironment& env, Port port,
00127                                  Boolean& isNew) {
00128   isNew = False;
00129   Socket* sock;
00130   do {
00131     sock = (Socket*) fTable->Lookup((char*)(long)(port.num()));
00132     if (sock == NULL) { // we need to create one:
00133       sock = CreateNew(env, port);
00134       if (sock == NULL || sock->socketNum() < 0) break;
00135 
00136       fTable->Add((char*)(long)(port.num()), (void*)sock);
00137       isNew = True;
00138     }
00139 
00140     return sock;
00141   } while (0);
00142 
00143   delete sock;
00144   return NULL;
00145 }
00146 
00147 Boolean SocketLookupTable::Remove(Socket const* sock) {
00148   return fTable->Remove( (char*)(long)(sock->port().num()) );
00149 }
00150 
00152 
00153 NetInterfaceTrafficStats::NetInterfaceTrafficStats() {
00154   fTotNumPackets = fTotNumBytes = 0.0;
00155 }
00156 
00157 void NetInterfaceTrafficStats::countPacket(unsigned packetSize) {
00158   fTotNumPackets += 1.0;
00159   fTotNumBytes += packetSize;
00160 }
00161 
00162 Boolean NetInterfaceTrafficStats::haveSeenTraffic() const {
00163   return fTotNumPackets != 0.0;
00164 }

Generated on Mon Apr 29 13:28:00 2013 for live by  doxygen 1.5.2