00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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;
00087 return (DirectedNetInterface*) fIter->next(key);
00088 };
00089
00090
00092
00093 int Socket::DebugLevel = 1;
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) {
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 }