Groupsock的分析_2

本文主要分析了Groupsock的成员函数,包括destRecord链表操作的removeAllDestination、removeDestination、addDestination和changeDestinationParamters,以及与组播地址相关的groupAddress、sourceFilterAddress和isSSM等函数。此外,还提到了辅助函数如write、sockNum等,以及发送和接收数据的outPut和handleRead函数。Groupsock涉及的socket操作实现在groupHelper.cpp中,对于网络编程学习者具有参考价值。

前面说了Groupsock的基类,现在来整体的分析下Groupsock:

首先是:

      removeAllDestination

      removeDestination

      addDestination

      changeDestinationParamters

这4个成员函数,这几个函数都是跟一个 destRecord链表关联的,成员变量 fDests指向这个链表的表头。

从字面意思基本可以得到,removeAllDestination是删除所有节点,removeDestination是删除指定节点。addDestination是添加节点(如果该节点不在链表中),changeDestinationParameters是改变fDests的参数。这个链表里面存放的都是组播地址,以及组播端口。

     第二组函数是:

    groupAddress:返回fIncomingGroupEid的组播地址

    sourceFilterAddress:返回fIncomingGroupEid 的过滤源地址(ssm:源指定多播)

    isSSM: 判断fIncomingGroupEid是否为SSM,即判断souceFilterAddress是否有效。

 在构造函数里面把fIncomingGroupEid对应的节点插入到了 fDests指向的链表中了。

    几个辅助函数:

    ttl :得到fTTL的值(这个可以无视,因为我们不用关心TTL)

    multicastSendOnly:(无关紧要,用于离开多播组的,而且在程序里面通过#if 0  直接掉过来函数体)

    wasLoopedBackFromUs:判断我们接受到的消息是否是 从本机而且是同一个端口发出的,防止自循环

    write:(这个函数在前面提到过,是从OutputSocket继承来的)用于fSocketNum向指定的地址和端口发送数据。

    sockNum :(前面提到的函数)用于得到fSocketNum。

    port:(前面提到的函数)用于得到fPort

    env:(前面提到的函数)用于得到fEnv,用于错误或者信息输出

    sourcePortNum:(前面提到的函数)用于得到fSourcePort

    changePort:(前面提到的函数)用于改变fSocketNum绑定的端口

   发送和接受数据的函数:

   outPut:通过循环调用write把给定消息依次发送到fDests指向的链表的各个组播地址,并记录状态(通过statsIncoming和statsGroupIncoming)

   handleRead:通过fSocketNum读取消息,后面调用了outputToAllMembersExcept函数(这个函数没看明白,不知道干嘛用的)。

   outputToAllMembersExcept:(没看明白)

   其它函数:

   两个构造函数和一个析构函数

   members:返回fMembers,这个成员变量是DirectedNetInterfaceSet类型,这是一个容器,里面有一个hashtable结构。(这个变量在outputToAllMembersExcept函数里面用到,所以同样也没发现起什么作用。

   上面的就是对Groupsock的主要分析了,groupsock里面涉及到socket方面的函数调用都在 groupHelper.cpp里面实现了,以后再看网络编程方面的 groupHelper.cpp肯定是一个很好的资料了(今天看了他通过令TTL=0,得到自己的ip,貌似挺不错的)

### Live555 源码结构与实现细节 Live555 是一个开源的多媒体流服务器框架,支持 RTSP 协议以及多种音视频编码格式。其源码设计模块化程度高,便于扩展和维护。以下是对其源码结构及其核心功能的详细分析。 #### 1. 源码主要组成部分 Live555 的源码被划分为多个独立的部分,每部分负责特定的功能域: - **UsageEnvironment**: 提供基础环境设置接口,包括事件循环机制、定时器管理等功能[^2]。 - **BasicUsageEnvironment**: 扩展 UsageEnvironment,提供更高级别的抽象层,主要用于处理输入输出操作。 - **Groupsock**: 实现组播套接字(Multicast Socket),用于网络数据传输中的多播通信。 - **liveMedia**: 核心媒体处理模块,封装了各种编解码器及相关协议的支持,如 RTP/RTCP 和 H.264/H.265 等[^2]。 - **testProgs**: 测试程序集合,包含一系列简单的客户端和服务端示例代码,帮助开发者快速上手。 - **mediaServer**: 媒体服务端逻辑实现,定义如何响应来自客户端的请求并发送媒体流[^2]。 #### 2. 关键类与函数解析 ##### (1) 播放控制流程 在处理 RTSP 请求时,Live555 使用了一系列方法来完成播放位置调整及实际播放过程: - `parseScaleHeader()` 和 `parseRangeHeader()` 方法分别解析缩放比例头信息和平滑范围头信息,从而确定播放的具体起始点与结束点[^3]。 - 遍历成员变量 `fNumStreamStates` 中存储的状态对象数组,逐一访问其中每个子会话实例 (`subsession`) 并调用 `OnDemandServerMediaSubsession::seekStream()` 来重新定位当前播放时间戳至指定位置。 - 同样通过迭代上述状态列表,在每次更新完成后再次逐项调用 `OnDemandServerMediaSubsession::startStream()` 函数启动对应的数据流传送任务[^3]。 ##### (2) 动态链接库生成 构建过程中会产生如下静态库文件: ```bash ./liveMedia/libliveMedia.a ./groupsock/libgroupsock.a ./UsageEnvironment/libUsageEnvironment.a ./BasicUsageEnvironment/libBasicUsageEnvironment.a ``` 这些库构成了整个系统的底层支撑体系,任何基于此平台的应用都需要依赖它们来进行初始化配置以及其他必要的交互操作[^4]。 #### 3. 示例代码片段 下面展示了一个简化版创建 RTSP 客户端连接的过程演示代码: ```cpp #include "liveMedia.hh" #include "BasicUsageEnvironment.hh" int main(int argc, char* argv[]) { TaskScheduler* scheduler = BasicTaskScheduler::createNew(); UsageEnvironment env(*scheduler); UserAuthenticationDatabase authDB; RTSPClient* rtspClient = RTSPClient::createNew(env, "rtsp://example.com/stream", &authDB); if (!rtspClient->sendDescribeCommand(*(new ResultHandler(rtspClient)))) { *env << "Failed to send DESCRIBE command\n"; } Medium::close(rtspClient); // Clean up resources. return 0; } ``` 以上代码展示了如何利用 Live555 库建立到远程 RTSP 服务器的一个基本连接,并尝试获取关于该资源的信息描述。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值