<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 3 0 0 0 0 0 0 0;}
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 3 0 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 3 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"\7D14\6587\5B57 \5B57\5143";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Calibri","sans-serif";}
span.a
        {mso-style-name:"\7D14\6587\5B57 \5B57\5143";
        mso-style-priority:99;
        mso-style-link:\7D14\6587\5B57;
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;}
/* Page Definitions */
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-TW" link="blue" vlink="purple" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoPlainText"><span lang="EN-US">Dear all,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">I post my source as following(refer to Live555MediaServer.cpp):<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">HANDLE g_hStartServerThread;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">char g_watch; //Used for doEventLoop()<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">volatile BOOL g_bServerStarted = FALSE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">void StartServerThread( LPVOID pParam )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        DBGPRINT(RT_DEBUG_TRACE, _T("[RaWLAPI][WDP] --> StartServerThread\n"));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        TaskScheduler* scheduler = BasicTaskScheduler::createNew();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    UserAuthenticationDatabase* authDB = NULL;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">#ifdef ACCESS_CONTROL<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    // To implement client access control to the RTSP server, do the following:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    authDB = new UserAuthenticationDatabase;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    authDB->addUserRecord("username1", "password1"); // replace these with real strings<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    // Repeat the above with each <username>, <password> that you wish to allow<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    // access to the server.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">#endif<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    // Create the RTSP server.  Try first with the default port number (554),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    // and then with the alternative port number (8554):<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    RTSPServer* rtspServer;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    portNumBits rtspServerPortNum = 554;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        if (rtspServer == NULL) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        rtspServerPortNum = 8554;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    if (rtspServer == NULL) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        exit(1);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    DBGPRINT(RT_DEBUG_TRACE, _T("[RaWLAPI][WDP] LIVE555 Media Server version = %s\n"), MEDIA_SERVER_VERSION_STRING);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    DBGPRINT(RT_DEBUG_TRACE, _T("[RaWLAPI][WDP] LIVE555 Streaming Media library version = %s\n"), LIVEMEDIA_LIBRARY_VERSION_STRING);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    char* urlPrefix = rtspServer->rtspURLPrefix();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    DBGPRINT(RT_DEBUG_TRACE, _T("[RaWLAPI][WDP] URL = %s\n"), urlPrefix);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    DBGPRINT(RT_DEBUG_TRACE, _T("[RaWLAPI][WDP] Support file type: aac, amr, m4e, 264, dv, mp3, mpg, ts, wmv\n"));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    // Also, attempt to create a HTTP server for RTSP-over-HTTP tunneling.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    // Try first with the default HTTP port (80), and then with the alternative HTTP<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    // port numbers (8000 and 8080).<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    if (rtspServer->setUpTunnelingOverHTTP(80) || rtspServer->setUpTunnelingOverHTTP(8000) || rtspServer->setUpTunnelingOverHTTP(8080)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        DBGPRINT(RT_DEBUG_TRACE, _T("[RaWLAPI][WDP] Use port %d for optional RTSP-over-HTTP tunneling\n"), rtspServer->httpServerPortNum());<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        DBGPRINT(RT_DEBUG_ERROR, _T("[RaWLAPI][WDP] RTSP-over-HTTP tunneling is not available!\n"));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    g_watch = 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    g_bServerStarted = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">    env->taskScheduler().doEventLoop(&g_watch); // does not return<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        </span><b><span lang="EN-US" style="font-size:14.0pt;color:red">Medium::close(rtspServer); //Close socket<o:p></o:p></span></b></p>
<p class="MsoPlainText"><span lang="EN-US">    DBGPRINT(RT_DEBUG_TRACE, _T("[RaWLAPI][WDP] <-- StartServerThread\n"));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">//*************  API  ************/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">DWORD WINAPI RARTSP_StartOrStopRTSPServer(BOOL bStart, TCHAR *szServerIP, int nServerPort)      
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        DWORD dwRet = RAWL_ERROR_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        if(bStart)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                g_hStartServerThread = NULL;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                g_hStartServerThread = (HANDLE)_beginthread(StartServerThread, NULL, NULL);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                while(FALSE == g_bServerStarted)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                        Sleep(10);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        else  //Stop server<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">                </span><b><i><span lang="EN-US" style="font-size:14.0pt;color:red">g_watch = 1;     //Let doEventLoop() return<o:p></o:p></span></i></b></p>
<p class="MsoPlainText"><span lang="EN-US">        }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">        return dwRet;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">When I want to stop server,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">I modify watch variable to let event loop return,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">and then call Media::Close to close server</span><span lang="EN-US" style="font-family:"Courier New"">’</span><span lang="EN-US">s socket.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">But socket still exist(netstat </span>
<span lang="EN-US" style="font-family:"Courier New"">–</span><span lang="EN-US">a show socket established) after that call.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">And though socket can be destroyed after terminate application,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">debug log also generates many memory leaks.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">And I wonder why Live555MediaServer.cpp does not delete scheduler and env objects,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">how are these objects released when application is terminated?<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Thanks.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Vincent Kao<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-----Original Message-----<br>
From: live-devel-bounces@ns.live555.com [mailto:live-devel-bounces@ns.live555.com] On Behalf Of Ross Finlayson<br>
Sent: Friday, May 20, 2011 6:35 PM<br>
To: LIVE555 Streaming Media - development & use<br>
Subject: Re: [Live-devel] About RTSPServer<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>Yes, I called Medium::close(pointerToYourRTSPServerObject) to stop
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>RTSP Server.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>But I found socket still exist after call that.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">That's odd.  The "RTSPServer" destructor definitely closes the
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">server's socket.  I don't know why that's not working for you.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-- <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Ross Finlayson<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Live Networks, Inc.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">http://www.live555.com/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">_______________________________________________<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">live-devel mailing list<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">live-devel@lists.live555.com<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">http://lists.live555.com/mailman/listinfo/live-devel<o:p></o:p></span></p>
</div>
CONFIDENTIALITY STATEMENT : The information, attachments and any rights attaching in this e-mail are confidential and privileged; it is intended only for the individual or entity named as the recipient hereof.Any disclosure, copying, distribution, dissemination
 or use of the contents of this e-mail by persons other than the intended recipient is STRICTLY PROHIBITED and may violate applicable laws.If you have received this e-mail in error, please delete the original message and notify us by return email or collect
 call immediately. Thank you.
</body>
</html>