From 109ffe9a777658936a38d0c146579a67c60a0d17 Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期四, 11 五月 2017 17:48:48 +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