首页 > 其他分享 >live555流媒体服务器解决客户端异常掉线后导致服务端通道阻塞的问题

live555流媒体服务器解决客户端异常掉线后导致服务端通道阻塞的问题

时间:2023-09-08 18:35:36浏览次数:41  
标签:live555 掉线 tv ClientSession msto SO 超时 服务端 客户端


live555在Linux环境下会因为客户端异常掉线后,偶现导致部分通道不能再被访问的问题,我们描述一下这个问题修复的过程。

本来是分析服务端CLOSE_WAIT的问题,在调试的过程中, 却又发现了阻塞,认真分析了live555的事件调用流程后,发现只要从客户端收到数据,就会执行GenericMediaServer::ClientSession::noteLiveness(),在该函数中会删除上一次的超时事件,然后新建一个超时事件放入调度队列中,而客户端突然掉线,正常情况是会调用该超时任务, 在该任务中删除ClientSession, 在大量的客户端连接的情况下(128路)突然掉线, 就有几率会出现阻塞,从而导致没有调用到该超时事件,进而导致socket不能释放了。

销毁上一次的超时任务,创建一个新的超时任务:

void GenericMediaServer::ClientSession::noteLiveness() {

  if (fOurServerMediaSession != NULL) fOurServerMediaSession->noteLiveness();

  if (fOurServer.fReclamationSeconds > 0) {
		pEnvironment->taskScheduler().rescheduleDelayedTask(fLivenessCheckTask,
							  fOurServer.fReclamationSeconds*1000000,
							  (TaskFunc*)livenessTimeoutTask, this);
}
}

超时任务实现如下:

void GenericMediaServer::ClientSession::livenessTimeoutTask(ClientSession* clientSession) {
	delete clientSession;
}

加了N多的打印日志, 最终分析为epoll检测到了socket有事件,并且调用了相应的处理函数, 在该函数中,调用了recvfrom而导致阻塞… 恍然大悟, 赶紧搜一下SO_RCVTIMEO,果然,在live555所有代码中,没有搜到该关键字。

解决问题

在创建socket后,设置接收数据超时时间即可。

#if defined(__WIN32__) || defined(_WIN32)
    DWORD msto = (DWORD)500;
    setsockopt(newSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&msto, sizeof(msto) );
    setsockopt(newSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&msto, sizeof(msto) );
#else
    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 500*1000;
    setsockopt(newSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof tv);
    
    setsockopt(newSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv);
#endif


标签:live555,掉线,tv,ClientSession,msto,SO,超时,服务端,客户端
From: https://blog.51cto.com/u_16247540/7412138

相关文章

  • live555最新版本修改对ipv6的支持
    在live555官方代码中只支持IPv4,现实环境中绝大多数项目也是IPv4,但是用支持IPv6的EasyRTSPClient去连接海康的相机,人家早就支持IPv6了。并且现工程投标中也有部分明确需要IPv6,所以在原IPv4基础上,动手改造支持IPv6。那么如何支持呢?方法如下:定义IPV4和IPV6live_ipv4_ipv6.htype......
  • live555作为RTSP流媒体服务器时Server端多track而客户端仅请求一个track,当客户端关闭
    当我们使用live555作为流媒体服务器时,某个通道对应的所有客户端断开后,不能正常回调关闭。某一通道同时支持视频和音频输出,即video和audio两个trackVLC和EasyPlayer播放库来中的RTSPClient则都会请求(所以不存在问题);而某些客户端则只请求了一个track,比如video;此时再关闭......
  • live555做流媒体服务器时解决rtp over udp模式下, 客户端没有发送teardown时直接关闭
    在我们使用live555作为RTSP服务器时,客户端在rtpoverudp模式下,rtsp客户端没有发送teardown而直接断开连接时需要等待65秒才回调关闭的问题。分析问题在RTSPClientConnection中没有保存相应的session值,所以在RTSPClientConnection断开时,并没有删除相应的RTSPClientSession;解......
  • 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,解码器网......
  • 【ROS2机器人入门到实战】MicroROS-服务通信服务端实现
    3.MicroROS-服务通信服务端实现写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn一、新建工程添加依赖新建example13_microro......
  • springboot 服务端接口公网远程调试﹣实现 HTTP 服务监听【端口映射】
    前言前后端分离项目中,在调用接口调试时候,我们可以通过cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试,本次教程我们以Java服务端接口为例。1.本地环境搭建1.1环境参数JDK1.8IDEASpringBootMavenTomcat9.0Postman1.2搭建springboot服务项目搭建一个springboot服务的......
  • linux部署NFS服务端与客户端测试(共享文件目录)
    部署NFS服务端与客户端并测试NFS服务端需要安装rpcbind和nfs-utilsNFS客户端只需要安装nfs-utilsnfs端口号2049RPC端口号111++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++服务端:使用yum安装#yuminstall-ynfs-u......
  • 数据库与服务端
    啥是数据库?​ 数据库是存储数据的地方,我们平时使用电脑或者手机,接触到的都是图形化界面,不能直接接触到数据库,其实,数据库无处不在,我们使用的绝大多数需要记录的数据都存储在数据库中,可以说,现如今的便捷生活,就是建立在数据库的基础上的。登录网站时,用户的账号和密码都存储在服务器......
  • 智慧养老系统健康监护系统服务端程序设计-计算机毕业设计源码+LW文档
    一、研究的背景意义当前,随着我国老龄化程度加急,各地纷纷构建高品质的养老院来适应城市的发展,养老院品质的上升并不等于养老院服务质量的上升,这就对养老院管理提出更高的要求。在传统的养老院管理中,许多工作都是依靠人力去解决。比如老人管理、水电费管理需要通过工人进行记录,往往......