首页 > 其他分享 >live555做流媒体服务器时解决rtp over udp模式下, 客户端没有发送teardown时直接关闭导致RTSPServer端没有即时关闭流的问题解决方法

live555做流媒体服务器时解决rtp over udp模式下, 客户端没有发送teardown时直接关闭导致RTSPServer端没有即时关闭流的问题解决方法

时间:2023-09-08 18:35:03浏览次数:46  
标签:pEnv live555 RTSPServer 关闭 over clientSession char sotcp NULL


在我们使用live555作为RTSP服务器时,客户端在rtp over udp模式下, rtsp客户端没有发送teardown而直接断开连接时需要等待65秒才回调关闭的问题。

分析问题

在RTSPClientConnection中没有保存相应的session值, 所以在RTSPClientConnection断开时, 并没有删除相应的RTSPClientSession;

解决问题

在RTSPClientConnection的声明中,增加以下定义;

char fClientSessionIdStr[16];	//for rtp over udp
		
		GenericMediaServer.hh  增加createNewClientSessionWithId的参数char *pSessionIdStr
		ClientSession* createNewClientSessionWithId(UsageEnvironment	*pEnv, char *pSessionIdStr);
		
		GenericMediaServer::ClientSession* GenericMediaServer::createNewClientSessionWithId(UsageEnvironment	*_pEnv, char *pSessionIdStr) {
		  u_int32_t sessionId;
		  char sessionIdStr[16] = {0};

		  // Choose a random (unused) 32-bit integer for the session id
		  // (it will be encoded as a 8-digit hex number).  (We avoid choosing session id 0,
		  // because that has a special use by some servers.)
		  do {
		    sessionId = (u_int32_t)our_random32();
		    snprintf(sessionIdStr, sizeof sessionIdStr, "%08X", sessionId);
		  } while (sessionId == 0 || lookupClientSession(sessionIdStr) != NULL);

		  ClientSession* clientSession = createNewClientSession(sessionId, _pEnv);
		  if (clientSession != NULL) fClientSessions->Add(sessionIdStr, clientSession);

		  if (NULL != pSessionIdStr)	strcpy(pSessionIdStr, sessionIdStr);		//此处返回生成的sessionId, 后续要根据该值找到对应的ClientSession

		  return clientSession;
		}		
		
		
		
		void RTSPServer::RTSPClientConnection::handleRequestBytes(int newBytesRead, UsageEnvironment *pEnv) {

			//找到以下代码		
		  if (authenticationOK("SETUP", urlTotalSuffix, (char const*)fRequestBuffer)) {
			  memset(fClientSessionIdStr, 0x00, sizeof(fClientSessionIdStr));
		    clientSession
		      = (RTSPServer::RTSPClientSession*)fOurRTSPServer.createNewClientSessionWithId(pEnv, fClientSessionIdStr);		//此处记录ClientSession的sessionId
		  }		
		
		}

此时,在RTSPClientConnection中已经保存了对应的SessionId, 在客户端断开连接时, 可以根据该SessionId, 找到相应的ClientSession, 然后删除;

void RTSPServer::stopTCPStreamingOnSocket(UsageEnvironment *pEnv, int socketNum, int *clientTrackNum, char *clientSessionIdStr){
		  // Close any stream that is streaming over "socketNum" (using RTP/RTCP-over-TCP streaming):

			RTSPClientSession	*pClientSession = NULL;

			LockClientConnection();
			do
			{
			  streamingOverTCPRecord* sotcp
				= (streamingOverTCPRecord*)fTCPStreamingDatabase->Lookup((char const*)socketNum);
			  if (sotcp != NULL) {		//rtp over tcp
				do {
				  RTSPClientSession* clientSession
				= (RTSPServer::RTSPClientSession*)lookupClientSession(sotcp->fSessionId);
				  if (clientSession != NULL) {
					  //clientSession->SetAssignSink(assignSink);
				clientSession->deleteStreamByTrack(pEnv, sotcp->fTrackNum, False, clientTrackNum);
				  }

				  streamingOverTCPRecord* sotcpNext = sotcp->fNext;
				  sotcp->fNext = NULL;
				  delete sotcp;
				  sotcp = sotcpNext;
				} while (sotcp != NULL);
				fTCPStreamingDatabase->Remove((char const*)socketNum);
			  }
			  else if ( (clientTrackNum) && (*clientTrackNum==0))		//rtp over udp
			  {
				  pClientSession = (RTSPServer::RTSPClientSession*)lookupClientSession(clientSessionIdStr);
			  }
			}while (0);

			UnlockClientConnection();

			if (pClientSession != NULL) 		//pClientSession不为空, 说明为rtp over udp
			{
				delete pClientSession;
			}

		}


标签:pEnv,live555,RTSPServer,关闭,over,clientSession,char,sotcp,NULL
From: https://blog.51cto.com/u_16247540/7412146

相关文章

  • live555作为RTSP客户端对接大华的某款球机RTSP流时不能预览问题的解决方案
    我们使用live555作为RTSP客户端拉取对接大华的球机RTSP直播流时,不能正常预览,球机在客户现场,型号未知。这种情况下,我们分析了,我们使用live555已接过N多种不同的摄像机,包括大华的相机之前也接过,没有出现过这种问题.而客户现场的电脑抓包软件也有问题,不能正常工作.只能加日志打印......
  • live555 RTSPClient客户端修正多网卡多ip情况下解码器不能解码显示问题
    问题海康NVR接入正常,但接入海康解码器出不来图像;分析海康解码器是以rtpoverudp的方式进行取流;如果运行streamingServer的PC,网络设置为以下两种情况,则都可以正常上墙显示:本机仅设置一个IP,且和解码器在同一网段;本机有两个IP,如192.168.xx.xx和190.168.xx.xx,解码器网......
  • 3. Oracle数据库异常关闭,导致错误3. Oracle数据库异常关闭,导致错误ERROR: ORA-01034:
    之前由于电脑没电,强制关机,导致Oracle数据库异常关闭,再次启动电脑登陆数据库时,发生以下错误:当我尝试重新启动数据库时,发生错误:经过查阅资料后得知:缺少INITXE.ORA文件,需要从下图目录中复制到上图指定目录中,并重命名为initXE.ora即可(这里initxxx.ora中的xxx要取决于你的SID)再......
  • Windows上要启动和停止关闭Nginx
    要启动和停止关闭Nginx,在Windows上,你可以使用以下命令:启动Nginx:```nginx```停止关闭Nginx:```nginx-sstop```如果你使用`startnginx`命令在后台启动了Nginx,则可以使用以下命令将其停止关闭:```nginx-squit```使用`stop`参数将会优雅地关闭Nginx,而使用`quit`参数将会......
  • mysql8关闭binlog并清空Binlog
    编辑my.ini或者my.cnf文件清空binlog信息#查看现存的binlog文件列表showmasterlogs;#重置清空binlog文件resetmaster;#重置清空后重新查看现存的binlog文件列表是否都被清空了showmasterlogs;停用binlog功能为啥要关闭binlog功能呢?是因为反正是个测试服务器,......
  • 关闭Ubuntu Server系统自动更新
    修改配置文件/etc/apt/apt.conf.d/10periodic中相关设置,进行关闭即可。$sudovim/etc/apt/apt.conf.d/10periodic0是关闭,1是开启,将所有值改为0APT::Periodic::Update-Package-Lists"0";APT::Periodic::Download-Upgradeable-Packages"0";APT::Periodic::Autocle......
  • ssh关闭之后 nginx tomcat mysql服务也被关了
    linux启动tomcat后,关闭ssh连接,tomcat进程停止 linux版本OpenSSH_8.3p1,OpenSSL1.0.2k-fips 26Jan2017老师给的建议是ssh版本降级到7.4  太难了没找到解决办法 最后找到下边文章在sshd@service中加入 KillMode=process配置 并用nohup启服务 生效  ......
  • [MSSQL]开启/关闭Ad Hoc Distributed Queries组件
    SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowset/OpenDatasource”的访问开启组件:execsp_configure'showadvancedoptions',1reconfigureexecsp_configure'AdHocDistributedQueries',1reconfigure关闭组件:execsp_configur......
  • Java Socket IO流关闭问题: Exception in thread "main" java.net.SocketException: S
    先说结论问题:明明执行的语句在socket.close前,却出现Exceptioninthread"main"java.net.SocketException:Socketisclosed报错结论:在Java中关闭一个包装流会导致它的底层流也被关闭所以一般使用socket.shutdownOutput()或socket.shutdownInput()关闭对应的流问题复现......
  • Centos7 关闭防火墙相关
    关闭防火墙systemctlstopiptablessystemctldisableiptablesyumremoveiptablesrm-rf/etc/sysconfig/iptablesrm-rf/etc/sysconfig/iptables-config systemctlstopfirewalld.servicesystemctldisablefirewalld.service #放行端口:(若面向外网,可向外网开放端口)......