<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2900.5726" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>
<DIV><FONT face=Arial size=2>H<FONT face="Times New Roman" size=3>i 
</FONT>Ross.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; I sent this e-mail on jenuary the 7th in an existing 
thread. I apologize for my fault.&nbsp;Here it is same question.</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; In the past you sayd (let me not 
search that mail!) that by now there is not a way to release live clientsessions 
when the RTSPServer is being deleted.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; I solved this issue with some 
code and I'd like to know your opinion about my solution.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; I 
defined&nbsp;fRTSPClientSessions in RTSPServer the same way it has 
fServerMediaSessions.</FONT></DIV><FONT face=Arial size=2>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; So in the RTSPServer constructor 
we find:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>
<DIV>[code]</DIV>&nbsp;&nbsp;&nbsp; 
fServerMediaSessions(HashTable::create(STRING_HASH_KEYS)), <BR>#if 
(USE_CLIENT_SESSION_MANAGEMENT)<BR>&nbsp;&nbsp;&nbsp; 
fRTSPClientSessions(HashTable::create(STRING_HASH_KEYS)),<BR>#endif // 
USE_CLIENT_SESSION_MANAGEMENT<BR></FONT></DIV>
<DIV><FONT face=Arial size=2>
<DIV>[/code]</DIV>
<DIV>&nbsp;</DIV></FONT></DIV>
<DIV><FONT face=Arial size=2>and in the RTSPServer destructor we 
find</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>[code]</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp; 
::closeSocket(fServerSocket);</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>#if (USE_CLIENT_SESSION_MANAGEMENT)<BR>&nbsp; // 
rimozione di eventuali client ancora presenti // deletion of live clients, if 
any<BR>&nbsp; while (1) {<BR>&nbsp;&nbsp;&nbsp; RTSPClientSession* 
rtspClientSession<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 
(RTSPClientSession*)fRTSPClientSessions-&gt;RemoveNext();<BR>&nbsp;&nbsp;&nbsp; 
if (rtspClientSession == NULL) break;<BR>&nbsp;&nbsp;&nbsp; try { delete 
rtspClientSession ; }catch(...)<BR>&nbsp;&nbsp;&nbsp; { 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a = 10 ; // for debug 
purpose<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; }<BR>#endif // 
USE_CLIENT_SESSION_MANAGEMENT</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; // Remove all server media sessions (they'll 
get deleted when they're finished):<BR>&nbsp; while (1) {<BR>&nbsp;&nbsp;&nbsp; 
ServerMediaSession* serverMediaSession<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 
(ServerMediaSession*)fServerMediaSessions-&gt;RemoveNext();<BR>&nbsp;&nbsp;&nbsp; 
if (serverMediaSession == NULL) break;<BR>&nbsp;&nbsp;&nbsp; 
removeServerMediaSession(serverMediaSession);<BR>&nbsp; }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp; // Finally, delete the session table 
itself:<BR>&nbsp; delete fServerMediaSessions;<BR>#if 
(USE_CLIENT_SESSION_MANAGEMENT)<BR>&nbsp; delete fRTSPClientSessions ;<BR>
<DIV>#endif // USE_CLIENT_SESSION_MANAGEMENT</DIV>
<DIV>[/code]</DIV>
<DIV>&nbsp;</DIV></DIV></FONT>
<DIV><FONT face=Arial size=2>In RTSPServer::RTSPClientSession constructor we 
find</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>
<DIV>[code]</DIV></FONT><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; 
fTCPStreamIdCount(0), fNumStreamStates(0), fStreamStates(NULL) {<BR>#if 
(USE_CLIENT_SESSION_MANAGEMENT)<BR>&nbsp; char strKey[50] ;<BR>&nbsp; unsigned 
__int64 ullAddress = (unsigned __int64)this ;<BR>&nbsp; sprintf( strKey, 
"%I64u", ullAddress ) ;<BR>&nbsp; // add without check for previous existing 
key<BR>&nbsp; fOurServer.fRTSPClientSessions-&gt;Add( strKey, this ) ;<BR>#endif 
// USE_CLIENT_SESSION_MANAGEMENT<BR>&nbsp; // Arrange to handle incoming 
requests:<BR></FONT><FONT face=Arial size=2><FONT face=Arial 
size=2>[/code]</DIV>
<DIV>&nbsp;</DIV>
<DIV>and in RTSPServer::RTSPClientSession destructor we find</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<DIV>[code]</DIV>&nbsp; reclaimStreamStates();</DIV>
<DIV>&nbsp;</DIV>
<DIV>#if (USE_CLIENT_SESSION_MANAGEMENT)<BR>&nbsp; char strKey[50] ;<BR>&nbsp; 
unsigned __int64 ullAddress = (unsigned __int64)this ;<BR>&nbsp; sprintf( 
strKey, "%I64u", ullAddress ) ;<BR>&nbsp; 
fOurServer.fRTSPClientSessions-&gt;Remove( strKey ) ;<BR>#endif // 
USE_CLIENT_SESSION_MANAGEMENT</DIV>
<DIV>[/code]</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; Ross, is there any pitfall in this clientsession 
management?</DIV>
<DIV>&nbsp;</DIV>
<DIV>Thank you very much,</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; Renato</DIV>
<DIV>&nbsp;</DIV></FONT></FONT></FONT></DIV></BODY></HTML>