Live555 源代码分析(二)

2020-09-20  本文已影响0人  RonZheng2010

1 Socket操作

Live555对常用的socket操作进行了包装。

1.1 setupDatagramSocket()

setupDatagramSocket()创建UDP socket。

1.2 setupStreamSocket()

setupStreamSocket()创建TCP socket。

1.3 increaseSendBufferTo()

increaseSendBufferTo()调用setsockopt(),增加发送缓存的大小。

1.4 writeSocket()、readSocket()

writeSocket()和readSocket()分别发送和接收数据包。

1.5 ourIPAddress()

ourIPAddress()得到本地地址。

2 RTP数据收发

2.1 RTPInterface

RTPInterface负责发送、接收数据包。

TCP协议和UDP协议都可以承载数据包。一个RTPInterface实例可以同时支持多路TCP数据和多路UDP数据。对于TCP,一个TCP连接上可以有多个channel,每个channel对应一路数据。

RTPInterface自己处理TCP部分。这其中需要借助tcpStreamRecord和SocketDescriptor。

RTPInterface将UDP部分委托给Groupsock,一个GroupSock实例处理多个UDP连接。

2.2 TCP连接上的数据格式

因为不同channel共用同一个TCP连接,所以SocketDescriptor发送数据包时,会加上一个数据包头,其中对不同channel加以区分。

TCP连接上的数据格式如下图所示。

2.3 用tcpStreamRecord发送TCP数据

RTPInterface::addStreamSocket()创建tcpStreamRecord实例,并注册到对应的SocketDescriptor实例中,以便监控socket的可读数据。

RTPInterface::sendRTPorRTPPacketOverTCP(),向单个TCP连接发送数据包。

2.4 用SocketDescriptor接收TCP数据

_Tables的成员socketTable保存了全局唯一的SocketDescriptor的hash表。

SocketDescriptor管理一个TCP socket,以及承载在它上面的channel。

对于SocketDescriptor,

SocketDescriptor::registerRTPInterface()还同时将SocketDescriptor::tcpReadHandler()设置为socket的监听函数。

当socket有数据可读时,SocketDescriptor::tcpReadHandler()被调用。

在tcpReadHandler1()中,

2.5 用GroupSock收发UDP数据

2.5.1 NetInterface和Socket

NetInterface和Socket定义了网络接口。

Port保存端口号,它的成员fPortNum是网络字节序的端口号。

对于NetInterface,

对于Socket,

Socket的构造函数调用setupDatagramSocket()创建socket,绑定本地端口号fPort,地址缺省为INADDR_ANY,即由协议层决定。

2.5.2 OutputSocket和Groupsock

OutputSocket和GroupSock分别实现了write()和handleRead()。

对于OutputSocket,

对于GroupSock,

成员函数output()遍历fDests中的组播地址,向它们发送数据包。

成员函数handleRead()负责接收消息。它调用全局函数readSocket(),后者调用recvfrom()接收数据包。接收的数据通过handleRead()返回给调用者。

2.6 用RTPInterface发送数据

RTPInterface::sendPacket()发送数据包。

5.7.用RTPInterface接收数据

成员函数startNetworkReading()开始监听所有的TCP和UDP连接。调用者需要指定有数据可读时的回调函数。

当RTCPInterface的UDP或TCP socket有数据可读时,调用者指定的回调函数被调用。这时它应该调用RTCPInterface::handleRead()读取数据。

6 RTCP消息收发

6.1 RTCPInstance

RTCPInstance从RTPSink的信息构造RTCP数据包,然后通过RTPInterface发送出去。OutPacketBuffer作为发送缓存使用。

对于OutPacketBuffer,

对于RTCPInstance,

6.2 发送RTCP消息

RTCPInstance::sendReport()是发送数据包的例子。它先调用addReport()和addSDES()构造数据包,然后在调用sendBuiltPacket()发送它。sendBuiltPacket使用了RTPInterface::sendPacket()。

RTCPInstance::schedule()设置一个超时任务。如果某些预期的事,没有在指定时间内发生,则触发指定的回调函数RTCPInstance::onExpire()进行重试。

RTCPInstace::onExpire()调用全局函数OnExpire()。在OnExpire()中,检查哪些事件没有如期发生,如发送BYE消息或其他消息没有成功,则重新尝试。

6.3 接收RTCP消息

RTCPInstance::setByeHandler()设置一个回调函数,收到对应消息时,该回调函数被调用。这个回调函数保存在成员fByeHandlerTask。

在RTCPInstance的构造函数中,调用RTCPInterface::startNetworkReading()。其中将RTCPInstance::incomingReportHandler()设置为数据可读时的回调函数。

在RTCPInstance::incomingReportHandler()中,

上一篇 下一篇

猜你喜欢

热点阅读