RtspClient.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF 281421,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const RtspClient_cxx_version =
  51.     "$Id: RtspClient.cxx,v 1.14 2001/06/29 21:02:43 bko Exp $";
  52. #include <iostream.h>
  53. #include <stdio.h>
  54. #include <stdlib.h>
  55. #include <errno.h>
  56. #include <unistd.h>
  57. #include <list>
  58. #include <fcntl.h>
  59. #include "NetworkAddress.h"
  60. #include "Connection.hxx"
  61. #include "Tcp_ClientSocket.hxx"
  62. #include "VNetworkException.hxx"
  63. #include "cpLog.h"
  64. #include "RtspTransceiver.hxx"
  65. #include "RtspMsg.hxx"
  66. #include "RtspMsgParser.hxx"
  67. int writeData( Connection conn, const char* buffer, int len );
  68. int readData( Connection conn, char* buffer, size_t bytesToRead);
  69. int main( int argc, char* argv[] )
  70. {
  71.     cpLogSetPriority(LOG_DEBUG_STACK);
  72.     if( argc < 3 )
  73.     {
  74.         printf("Usage: %s remotehost remoteportn", argv[0] );
  75.         return 0;
  76.     }
  77.     // build remote address
  78.     string rmtHost = argv[1];
  79.     int rmtPort = atoi( argv[2] );
  80.     NetworkAddress remoteAddress( rmtHost, rmtPort );
  81.     // create TCP connection
  82.     // close connection = true
  83.     // blocking = false
  84.     cout <<"Connecting to: ";
  85.     remoteAddress.print( cout );
  86.     cout <<endl;
  87.     TcpClientSocket cSock( remoteAddress, true, false );
  88.     try
  89.     {
  90.         cSock.connect();
  91.     }
  92.     catch (VException &e)
  93.     {
  94.         cerr <<e.getDescription().c_str()<<endl;
  95.         return 0;
  96.     }
  97.     // create a buffer
  98.     list< pair<int, string> > myBufferList;
  99.     myBufferList.push_back( pair<int,string>( 0, "DESCRIBE rtsp://www.vovida.com/sounds/LINEAR16 RTSP/1.0rnCSeq: 1rnAccept: application/sdprnrn" ) );
  100.     myBufferList.push_back( pair<int,string>( 0, "SETUP rtsp://www.vovida.com/sounds/LINEAR16.raw RTSP/1.0rnCSeq: 2rnTransport: rtp/avp;unicast;client_port=9000-9001rnrn" ) );
  101.     myBufferList.push_back( pair<int,string>( 0, "PLAY rtsp://www.vovida.com/sounds/LINEAR16.raw RTSP/1.0rnSession: 6000rnCSeq: 3rnrn" ) );
  102.     myBufferList.push_back( pair<int,string>( 5, "SETUP rtsp://www.vovida.com/sounds/LINEAR16 RTSP/1.0rnCSeq: 2rnTransport: rtp/avp;unicast;client_port=9000-9001rnrn" ) );
  103.     myBufferList.push_back( pair<int,string>( 0, "PLAY rtsp://www.vovida.com/sounds/LINEAR16 RTSP/1.0rnSession: 6001rnCSeq: 3rnrn" ) );
  104.     myBufferList.push_back( pair<int,string>( 10, "TEARDOWN rtsp://www.vovida.com/sounds/LINEAR16 RTSP/1.0rnSession: 6001rnCSeq: 6rnrn" ) );
  105.     myBufferList.push_back( pair<int,string>( 10, "TEARDOWN rtsp://www.vovida.com/sounds/LINEAR16 RTSP/1.0rnSession: 6000rnCSeq: 6rnrn" ) );
  106.     char buffer[1024];
  107.     Sptr< RtspMsg > savedMsg = 0;
  108.     Sptr< RtspMsg > response = 0;
  109.     for( list< pair<int, string> >::iterator itr = myBufferList.begin();
  110.          itr != myBufferList.end(); itr++ )
  111.     {
  112.         if( itr->first != 0 )
  113.         {
  114.             cout <<"Waiting "<<itr->first<<" seconds until next requestn";
  115.             sleep(itr->first);
  116.         }
  117.         string msg = itr->second;
  118.         writeData( cSock.getConn(), msg.c_str(), msg.length() );
  119.         if (cSock.getConn().isReadReady(1)) 
  120.         {
  121.             int cc = readData( cSock.getConn(), buffer, 1024 );
  122.             int ccout = 0;
  123.             cout << "cc= " << cc << endl;
  124.             cout << "ccout= " << ccout << endl;
  125.             RtspMsgParser parser;
  126.             // only try to get one msg from this buffer
  127.             response = parser.preParse( buffer, cc, ccout, savedMsg );
  128.             if( response->getCompletionFlag() == RTSP_MSG_COMPLETE )
  129.             {
  130.                 savedMsg = 0;
  131.             } 
  132.             else
  133.             {
  134.                 savedMsg = response;
  135.                 if (cc < 1024)
  136.                     cout << "Response msg is fragmented." << endl;
  137.                 else
  138.                     cout << "Response msg is too big." << endl;
  139.             }
  140.         }
  141.     }
  142.     cout <<"Sleeping 5 secn";
  143.     sleep( 5 );
  144.     cout <<"Closing connectionn";
  145.     cSock.close();
  146.     cout <<"Donen";
  147.     return 0;
  148. }
  149. int
  150. writeData( Connection conn, const char* buffer, int len )
  151. {
  152.     cout <<"Sendingn";
  153.     cout <<"---------------------n";
  154.     cout <<buffer<<endl;
  155.     cout <<"---------------------n";
  156.     // write buffer to TCP connection
  157.     try
  158.     {
  159.         conn.writeData( (void*)buffer, len );
  160.     }
  161.     catch( VNetworkException& e )
  162.     {
  163.         cerr <<e.getDescription()<<endl;
  164.         return 0;
  165.     }
  166.     return 0;
  167. }
  168. int
  169. readData( Connection conn, char* rdbuf, size_t bytesToRead )
  170. {
  171.     int bytesRead;
  172.     RtspTransceiver::readData( conn, (void*)rdbuf, bytesToRead, bytesRead);
  173.     if (bytesRead > 0)
  174.     {
  175.         Data dRead(rdbuf, bytesRead);
  176.         cout <<"Server responded: n";
  177.         cout <<"---------------------n";
  178.         cout <<"bytesRead= " << bytesRead << endl;
  179.         cout <<dRead.getData()<<endl;
  180.         cout <<"---------------------n";
  181.         return bytesRead;
  182.     }
  183.     else
  184.     {
  185.         cout << "Server no response n";
  186.         return 0;
  187.     }
  188. }
  189. /*
  190. int
  191. readData( Connection conn, char* rdbuf )
  192. {
  193.     // read reply from TCP connection
  194.     string dRead;
  195.     int nRead = 0;
  196.     cout <<"Waiting for replyn";
  197.     fcntl(conn.getConnId(), F_SETFL, O_NONBLOCK);
  198.     while( conn.readLine( rdbuf, (sizeof(rdbuf) - 1), nRead ) )
  199.     {
  200.         rdbuf[nRead] = '';
  201.         dRead += rdbuf;
  202.         rdbuf[0] = '';
  203.         nRead = 0;
  204.         if( !conn.isReadReady() )
  205.             break;
  206.     }
  207.     rdbuf[nRead] = '';
  208.     dRead += rdbuf;
  209.     cout <<"Server responded: n";;
  210.     cout <<"---------------------n";
  211.     cout <<dRead<<endl;
  212.     cout <<"---------------------n";
  213.     return 0;
  214. }
  215. */
  216. /* Local Variables: */
  217. /* c-file-style: "stroustrup" */
  218. /* indent-tabs-mode: nil */
  219. /* c-file-offsets: ((access-label . -) (inclass . ++)) */
  220. /* c-basic-offset: 4 */
  221. /* End: */