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_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;
00080 return (DirectedNetInterface*) fIter->next(key);
00081 };
00082
00083
00085
00086 int Socket::DebugLevel = 1;
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) {
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) {
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 }