From fba844dd98c3d9dde3a522cacfb5cff24f0a3943 Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期六, 01 四月 2017 14:16:59 +0800
Subject: [PATCH]
---
VisitFace/RtspNativeCodec/app/libs/live555/include/groupsock/Groupsock.hh | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 218 insertions(+), 0 deletions(-)
diff --git a/VisitFace/RtspNativeCodec/app/libs/live555/include/groupsock/Groupsock.hh b/VisitFace/RtspNativeCodec/app/libs/live555/include/groupsock/Groupsock.hh
new file mode 100644
index 0000000..8d96c99
--- /dev/null
+++ b/VisitFace/RtspNativeCodec/app/libs/live555/include/groupsock/Groupsock.hh
@@ -0,0 +1,218 @@
+/**********
+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-2017 Live Networks, Inc. All rights reserved.
+// 'Group sockets'
+// C++ header
+
+#ifndef _GROUPSOCK_HH
+#define _GROUPSOCK_HH
+
+#ifndef _GROUPSOCK_VERSION_HH
+#include "groupsock_version.hh"
+#endif
+
+#ifndef _NET_INTERFACE_HH
+#include "NetInterface.hh"
+#endif
+
+#ifndef _GROUPEID_HH
+#include "GroupEId.hh"
+#endif
+
+// An "OutputSocket" is (by default) used only to send packets.
+// No packets are received on it (unless a subclass arranges this)
+
+class OutputSocket: public Socket {
+public:
+ OutputSocket(UsageEnvironment& env);
+ virtual ~OutputSocket();
+
+ virtual Boolean write(netAddressBits address, portNumBits portNum/*in network order*/, u_int8_t ttl,
+ unsigned char* buffer, unsigned bufferSize);
+ Boolean write(struct sockaddr_in& addressAndPort, u_int8_t ttl,
+ unsigned char* buffer, unsigned bufferSize) {
+ return write(addressAndPort.sin_addr.s_addr, addressAndPort.sin_port, ttl, buffer, bufferSize);
+ }
+
+protected:
+ OutputSocket(UsageEnvironment& env, Port port);
+
+ portNumBits sourcePortNum() const {return fSourcePort.num();}
+
+private: // redefined virtual function
+ virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize,
+ unsigned& bytesRead,
+ struct sockaddr_in& fromAddressAndPort);
+
+private:
+ Port fSourcePort;
+ unsigned fLastSentTTL;
+};
+
+class destRecord {
+public:
+ destRecord(struct in_addr const& addr, Port const& port, u_int8_t ttl, unsigned sessionId,
+ destRecord* next);
+ virtual ~destRecord();
+
+public:
+ destRecord* fNext;
+ GroupEId fGroupEId;
+ unsigned fSessionId;
+};
+
+// A "Groupsock" is used to both send and receive packets.
+// As the name suggests, it was originally designed to send/receive
+// multicast, but it can send/receive unicast as well.
+
+class Groupsock: public OutputSocket {
+public:
+ Groupsock(UsageEnvironment& env, struct in_addr const& groupAddr,
+ Port port, u_int8_t ttl);
+ // used for a 'source-independent multicast' group
+ Groupsock(UsageEnvironment& env, struct in_addr const& groupAddr,
+ struct in_addr const& sourceFilterAddr,
+ Port port);
+ // used for a 'source-specific multicast' group
+ virtual ~Groupsock();
+
+ virtual destRecord* createNewDestRecord(struct in_addr const& addr, Port const& port, u_int8_t ttl, unsigned sessionId, destRecord* next);
+ // Can be redefined by subclasses that also subclass "destRecord"
+
+ void changeDestinationParameters(struct in_addr const& newDestAddr,
+ Port newDestPort, int newDestTTL,
+ unsigned sessionId = 0);
+ // By default, the destination address, port and ttl for
+ // outgoing packets are those that were specified in
+ // the constructor. This works OK for multicast sockets,
+ // but for unicast we usually want the destination port
+ // number, at least, to be different from the source port.
+ // (If a parameter is 0 (or ~0 for ttl), then no change is made to that parameter.)
+ // (If no existing "destRecord" exists with this "sessionId", then we add a new "destRecord".)
+ unsigned lookupSessionIdFromDestination(struct sockaddr_in const& destAddrAndPort) const;
+ // returns 0 if not found
+
+ // As a special case, we also allow multiple destinations (addresses & ports)
+ // (This can be used to implement multi-unicast.)
+ virtual void addDestination(struct in_addr const& addr, Port const& port, unsigned sessionId);
+ virtual void removeDestination(unsigned sessionId);
+ void removeAllDestinations();
+ Boolean hasMultipleDestinations() const { return fDests != NULL && fDests->fNext != NULL; }
+
+ struct in_addr const& groupAddress() const {
+ return fIncomingGroupEId.groupAddress();
+ }
+ struct in_addr const& sourceFilterAddress() const {
+ return fIncomingGroupEId.sourceFilterAddress();
+ }
+
+ Boolean isSSM() const {
+ return fIncomingGroupEId.isSSM();
+ }
+
+ u_int8_t ttl() const { return fIncomingGroupEId.ttl(); }
+
+ void multicastSendOnly(); // send, but don't receive any multicast packets
+
+ virtual Boolean output(UsageEnvironment& env, unsigned char* buffer, unsigned bufferSize,
+ DirectedNetInterface* interfaceNotToFwdBackTo = NULL);
+
+ DirectedNetInterfaceSet& members() { return fMembers; }
+
+ Boolean deleteIfNoMembers;
+ Boolean isSlave; // for tunneling
+
+ static NetInterfaceTrafficStats statsIncoming;
+ static NetInterfaceTrafficStats statsOutgoing;
+ static NetInterfaceTrafficStats statsRelayedIncoming;
+ static NetInterfaceTrafficStats statsRelayedOutgoing;
+ NetInterfaceTrafficStats statsGroupIncoming; // *not* static
+ NetInterfaceTrafficStats statsGroupOutgoing; // *not* static
+ NetInterfaceTrafficStats statsGroupRelayedIncoming; // *not* static
+ NetInterfaceTrafficStats statsGroupRelayedOutgoing; // *not* static
+
+ Boolean wasLoopedBackFromUs(UsageEnvironment& env, struct sockaddr_in& fromAddressAndPort);
+
+public: // redefined virtual functions
+ virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize,
+ unsigned& bytesRead,
+ struct sockaddr_in& fromAddressAndPort);
+
+protected:
+ destRecord* lookupDestRecordFromDestination(struct sockaddr_in const& destAddrAndPort) const;
+
+private:
+ void removeDestinationFrom(destRecord*& dests, unsigned sessionId);
+ // used to implement (the public) "removeDestination()", and "changeDestinationParameters()"
+ int outputToAllMembersExcept(DirectedNetInterface* exceptInterface,
+ u_int8_t ttlToFwd,
+ unsigned char* data, unsigned size,
+ netAddressBits sourceAddr);
+
+protected:
+ destRecord* fDests;
+private:
+ GroupEId fIncomingGroupEId;
+ DirectedNetInterfaceSet fMembers;
+};
+
+UsageEnvironment& operator<<(UsageEnvironment& s, const Groupsock& g);
+
+// A data structure for looking up a 'groupsock'
+// by (multicast address, port), or by socket number
+class GroupsockLookupTable {
+public:
+ Groupsock* Fetch(UsageEnvironment& env, netAddressBits groupAddress,
+ Port port, u_int8_t ttl, Boolean& isNew);
+ // Creates a new Groupsock if none already exists
+ Groupsock* Fetch(UsageEnvironment& env, netAddressBits groupAddress,
+ netAddressBits sourceFilterAddr,
+ Port port, Boolean& isNew);
+ // Creates a new Groupsock if none already exists
+ Groupsock* Lookup(netAddressBits groupAddress, Port port);
+ // Returns NULL if none already exists
+ Groupsock* Lookup(netAddressBits groupAddress,
+ netAddressBits sourceFilterAddr,
+ Port port);
+ // Returns NULL if none already exists
+ Groupsock* Lookup(UsageEnvironment& env, int sock);
+ // Returns NULL if none already exists
+ Boolean Remove(Groupsock const* groupsock);
+
+ // Used to iterate through the groupsocks in the table
+ class Iterator {
+ public:
+ Iterator(GroupsockLookupTable& groupsocks);
+
+ Groupsock* next(); // NULL iff none
+
+ private:
+ AddressPortLookupTable::Iterator fIter;
+ };
+
+private:
+ Groupsock* AddNew(UsageEnvironment& env,
+ netAddressBits groupAddress,
+ netAddressBits sourceFilterAddress,
+ Port port, u_int8_t ttl);
+
+private:
+ friend class Iterator;
+ AddressPortLookupTable fTable;
+};
+
+#endif
--
Gitblit v1.8.0