| /********** |
| This library is free software; you can redistribute it and/or modify it under |
| the terms of the GNU Lesser General Public License as published by the |
| Free Software Foundation; either version 3 of the License, or (at your |
| option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.) |
| |
| This library is distributed in the hope that it will be useful, but WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for |
| more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with this library; if not, write to the Free Software Foundation, Inc., |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| **********/ |
| // "mTunnel" multicast access service |
| // Copyright (c) 1996-2020 Live Networks, Inc. All rights reserved. |
| // Network Interfaces |
| // C++ header |
| |
| #ifndef _NET_INTERFACE_HH |
| #define _NET_INTERFACE_HH |
| |
| #ifndef _NET_ADDRESS_HH |
| #include "NetAddress.hh" |
| #endif |
| |
| class NetInterface { |
| public: |
| virtual ~NetInterface(); |
| |
| static UsageEnvironment* DefaultUsageEnvironment; |
| // if non-NULL, used for each new interfaces |
| |
| protected: |
| NetInterface(); // virtual base class |
| }; |
| |
| class DirectedNetInterface: public NetInterface { |
| public: |
| virtual ~DirectedNetInterface(); |
| |
| virtual Boolean write(unsigned char* data, unsigned numBytes) = 0; |
| |
| virtual Boolean SourceAddrOKForRelaying(UsageEnvironment& env, |
| unsigned addr) = 0; |
| |
| protected: |
| DirectedNetInterface(); // virtual base class |
| }; |
| |
| class DirectedNetInterfaceSet { |
| public: |
| DirectedNetInterfaceSet(); |
| virtual ~DirectedNetInterfaceSet(); |
| |
| DirectedNetInterface* Add(DirectedNetInterface const* interf); |
| // Returns the old value if different, otherwise 0 |
| Boolean Remove(DirectedNetInterface const* interf); |
| |
| Boolean IsEmpty() { return fTable->IsEmpty(); } |
| |
| // Used to iterate through the interfaces in the set |
| class Iterator { |
| public: |
| Iterator(DirectedNetInterfaceSet& interfaces); |
| virtual ~Iterator(); |
| |
| DirectedNetInterface* next(); // NULL iff none |
| |
| private: |
| HashTable::Iterator* fIter; |
| }; |
| |
| private: |
| friend class Iterator; |
| HashTable* fTable; |
| }; |
| |
| class Socket: public NetInterface { |
| public: |
| virtual ~Socket(); |
| void reset(); // closes the socket, and sets "fSocketNum" to -1 |
| |
| virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize, |
| unsigned& bytesRead, |
| struct sockaddr_in& fromAddress) = 0; |
| // Returns False on error; resultData == NULL if data ignored |
| |
| int socketNum() const { return fSocketNum; } |
| |
| Port port() const { |
| return fPort; |
| } |
| |
| UsageEnvironment& env() const { return fEnv; } |
| |
| static int DebugLevel; |
| |
| protected: |
| Socket(UsageEnvironment& env, Port port); // virtual base class |
| |
| Boolean changePort(Port newPort); // will also cause socketNum() to change |
| |
| private: |
| int fSocketNum; |
| UsageEnvironment& fEnv; |
| Port fPort; |
| }; |
| |
| UsageEnvironment& operator<<(UsageEnvironment& s, const Socket& sock); |
| |
| // A data structure for looking up a Socket by port: |
| |
| class SocketLookupTable { |
| public: |
| virtual ~SocketLookupTable(); |
| |
| Socket* Fetch(UsageEnvironment& env, Port port, Boolean& isNew); |
| // Creates a new Socket if none already exists |
| Boolean Remove(Socket const* sock); |
| |
| protected: |
| SocketLookupTable(); // abstract base class |
| virtual Socket* CreateNew(UsageEnvironment& env, Port port) = 0; |
| |
| private: |
| HashTable* fTable; |
| }; |
| |
| // A data structure for counting traffic: |
| |
| class NetInterfaceTrafficStats { |
| public: |
| NetInterfaceTrafficStats(); |
| |
| void countPacket(unsigned packetSize); |
| |
| float totNumPackets() const {return fTotNumPackets;} |
| float totNumBytes() const {return fTotNumBytes;} |
| |
| Boolean haveSeenTraffic() const; |
| |
| private: |
| float fTotNumPackets; |
| float fTotNumBytes; |
| }; |
| |
| #endif |