⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtspserver.hh

📁 流媒体传输协议的实现代码,非常有用.可以支持rtsp mms等流媒体传输协议
💻 HH
字号:
/**********This library is free software; you can redistribute it and/or modify it underthe terms of the GNU Lesser General Public License as published by theFree Software Foundation; either version 2.1 of the License, or (at youroption) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)This library is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License formore details.You should have received a copy of the GNU Lesser General Public Licensealong with this library; if not, write to the Free Software Foundation, Inc.,59 Temple Place, Suite 330, Boston, MA  02111-1307  USA**********/// "liveMedia"// Copyright (c) 1996-2004 Live Networks, Inc.  All rights reserved.// A RTSP server// C++ header#ifndef _RTSP_SERVER_HH#define _RTSP_SERVER_HH#ifndef _SERVER_MEDIA_SESSION_HH#include "ServerMediaSession.hh"#endif#ifndef _NET_ADDRESS_HH#include <NetAddress.hh>#endif#ifndef _DIGEST_AUTHENTICATION_HH#include "DigestAuthentication.hh"#endif// A data structure used for optional user/password authentication:class UserAuthenticationDatabase {public:  UserAuthenticationDatabase(char const* realm = NULL,			     Boolean passwordsAreMD5 = False);    // If "passwordsAreMD5" is True, then each password stored into, or removed from,    // the database is actually the value computed    // by md5(<username>:<realm>:<actual-password>)  virtual ~UserAuthenticationDatabase();  virtual void addUserRecord(char const* username, char const* password);  virtual void removeUserRecord(char const* username);  virtual char const* lookupPassword(char const* username);      // returns NULL if the user name was not present  char const* realm() { return fRealm; }  Boolean passwordsAreMD5() { return fPasswordsAreMD5; }protected:  HashTable* fTable;  char* fRealm;  Boolean fPasswordsAreMD5;};#define RTSP_BUFFER_SIZE 10000 // for incoming requests, and outgoing responsesclass RTSPServer: public Medium {public:  static RTSPServer* createNew(UsageEnvironment& env, Port ourPort = 554,			       UserAuthenticationDatabase* authDatabase = NULL,			       unsigned reclamationTestSeconds = 0);      // If ourPort.num() == 0, we'll choose the port number      // Note: The caller is responsible for reclaiming "authDatabase"      // If "reclamationTestSeconds" > 0, then the "RTSPClientSession" state for      //     each client will get reclaimed (and the corresponding RTP stream(s)      //     torn down) if no RTSP commands from the client are received in at least       //     "reclamationTestSeconds" seconds.  static Boolean lookupByName(UsageEnvironment& env, char const* name,			      RTSPServer*& resultServer);  void addServerMediaSession(ServerMediaSession* serverMediaSession);  ServerMediaSession* lookupServerMediaSession(char const* streamName);  void removeServerMediaSession(ServerMediaSession* serverMediaSession);  void removeServerMediaSession(char const* streamName);  char* rtspURL(ServerMediaSession const* serverMediaSession) const;      // returns a "rtsp://" URL that could be used to access the      // specified session (which must already have been added to      // us using "addServerMediaSession()".      // This string is dynamically allocated; caller should delete[]protected:  RTSPServer(UsageEnvironment& env,	     int ourSocket, Port ourPort,	     UserAuthenticationDatabase* authDatabase,	     unsigned reclamationTestSeconds);      // called only by createNew();  virtual ~RTSPServer();  static int setUpOurSocket(UsageEnvironment& env, Port& ourPort);private: // redefined virtual functions  virtual Boolean isRTSPServer() const;private:  static void incomingConnectionHandler(void*, int /*mask*/);  void incomingConnectionHandler1();  // The state of each individual session handled by a RTSP server:  class RTSPClientSession {  public:    RTSPClientSession(RTSPServer& ourServer, unsigned sessionId,		      int clientSocket, struct sockaddr_in clientAddr);    virtual ~RTSPClientSession();  private:    UsageEnvironment& envir() { return fOurServer.envir(); }    void reclaimStreamStates();    static void incomingRequestHandler(void*, int /*mask*/);    void incomingRequestHandler1();    void handleCmd_bad(char const* cseq);    void handleCmd_notSupported(char const* cseq);    void handleCmd_notFound(char const* cseq);    void handleCmd_unsupportedTransport(char const* cseq);    void handleCmd_OPTIONS(char const* cseq);    void handleCmd_DESCRIBE(char const* cseq, char const* urlSuffix,			    char const* fullRequestStr);    void handleCmd_SETUP(char const* cseq,			 char const* urlPreSuffix, char const* urlSuffix,			 char const* fullRequestStr);    void handleCmd_withinSession(char const* cmdName,				 char const* urlPreSuffix, char const* urlSuffix,				 char const* cseq, char const* fullRequestStr);    void handleCmd_TEARDOWN(ServerMediaSubsession* subsession,			    char const* cseq);    void handleCmd_PLAY(ServerMediaSubsession* subsession,			char const* cseq, char const* fullRequestStr);    void handleCmd_PAUSE(ServerMediaSubsession* subsession,			 char const* cseq);    void handleCmd_GET_PARAMETER(ServerMediaSubsession* subsession,				 char const* cseq, char const* fullRequestStr);    Boolean authenticationOK(char const* cmdName, char const* cseq,			     char const* fullRequestStr);    Boolean parseRequestString(char const *reqStr, unsigned reqStrSize,			       char *resultCmdName,			       unsigned resultCmdNameMaxSize, 			       char* resultURLPreSuffix,			       unsigned resultURLPreSuffixMaxSize, 			       char* resultURLSuffix,			       unsigned resultURLSuffixMaxSize, 			       char* resultCSeq,			       unsigned resultCSeqMaxSize);     void noteClientLiveness();    static void livenessTimeoutTask(RTSPClientSession* clientSession);  private:    RTSPServer& fOurServer;    unsigned fOurSessionId;    ServerMediaSession* fOurServerMediaSession;    int fClientSocket;    struct sockaddr_in fClientAddr;    TaskToken fLivenessCheckTask;    unsigned char fBuffer[RTSP_BUFFER_SIZE];    unsigned char fResponseBuffer[RTSP_BUFFER_SIZE];    Boolean fSessionIsActive, fStreamAfterSETUP;    Authenticator fCurrentAuthenticator; // used if access control is needed    unsigned char fTCPStreamIdCount; // used for (optional) RTP/TCP    unsigned fNumStreamStates;     struct streamState {      ServerMediaSubsession* subsession;      void* streamToken;    } * fStreamStates;  };private:  friend class RTSPClientSession;  int fServerSocket;  Port fServerPort;  UserAuthenticationDatabase* fAuthDB;  unsigned fReclamationTestSeconds;  HashTable* fServerMediaSessions;  unsigned fSessionIdCounter;};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -