ARTSPConnection::receiveLine

2024-06-04 03:08

本文主要是介绍ARTSPConnection::receiveLine,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.RTSP消息格式的格式

  RTSP的消息有两大类: 请求消息(request), 回应消息(response).
  
  请求消息:

    方法 URI RTSP版本 CR LF 消息头 CR LFCR LF 消息体 CR LF 

  其中方法包括OPTION回应中所有的命令,URI是接受方的地址,例如:rtsp://192.168.20.136. RTSP版本一般都是 RTSP/1.0. 每行后面的CR LF表示回车换行, 需要接受端有相应的解析, 最后一个消息头需要有两个CR LF(即空行)

  回应消息:

    RTSP版本 状态码 解释 CR LF 消息头 CR LFCR LF 消息体 CR LF 

例子:

 S->C:   RTSP/1.0 551 Option not supportedCSeq: 302Unsupported: funky-feature

 注:CR指的是 \r,LF指的是\n。

2.安卓N版本ARTSPConnection::receiveLine

bool ARTSPConnection::receiveLine(AString *line) {//该函数接口的功能是从消息里获取一行,然后由参数line传回给调用者line->clear();//布尔变量sawCR用来标识当前在从套接口获取字符非时候是否已经遇到了CR字符bool sawCR = false;for (;;) {char c;//从创建的套接口获取一个字符if (receive(&c, 1) != OK) {return false;}if (sawCR && c == '\n') {//如果sawCR为真,表明之前获取的字符中已经遇到了CR字符//c == '\n'表明现在又遇到了LF字符,则已经读取到了完整的一行//将读取到line里的CR字符删除掉,函数返回trueline->erase(line->size() - 1, 1);return true;} else if (c == '\n') {//当sawCR不为真,而当前又读取到了LF字符(c == '\n')//说明也已经读取到了完整的一行,函数返回true,因为有些行只以'\n'结尾// some reponse line ended with '\n', instead of '\r\n'.return true;}//代码执行到这里说明跳过了前面的结束标识检查,将该字符读取到line里line->append(&c, 1);if (c == '$' && line->size() == 1) {//如果c == '$',后面的是二进制数据,需要进行特别的处理//此时line里只存一个字符,就是'$'。// Special-case for interleaved binary data.return true;}//判断当前读取到line里的字符是否为CR字符sawCR = (c == '\r');}
}

  小结:该函数就是设计了一个算法,从创建的套接口里获取服务端的消息的一行。一行的结尾标识为’\r’ \n’或者为’\n’。而且需要为二进制数据进行特别的处理。
  个人认为该算法存在效率上的不足,因为如果是’\r’ \n’结尾的话就需要调用line->erase(line->size() - 1, 1)函数将已经读取的’\r’字符删掉,而line->erase函数设计到内存拷贝,所以会影响到效率。
  个人认为可以采用缓存的思想来避免’\r’字符存入。效率能提升一点是一点,整个系统那么庞大,如果每个细节都能精心地设计,量变到质变,性能会有很大的提升。

这篇关于ARTSPConnection::receiveLine的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028888

相关文章

ARTSPConnection::receiveRTSPReponse

bool ARTSPConnection::receiveRTSPReponse() {AString statusLine;//调用函数receiveLine从套接口获取服务端消息的第一行,在下文被称为状态行statusLineif (!receiveLine(&statusLine)) {return false;}if (statusLine == "$") {//如果状态行statusLi

ARTSPConnection::receive

1.recv函数介绍   int recv( SOCKET s, char FAR *buf, int len, int flags );   不论是客户端还是服务器端应用程序都用recv函数从TCP连接的另一端接收数据。   参数解释:     1.参数s指定接收端套接字描述符;     2.参数buf指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据     3.参数len指

ARTSPConnection::postReceiveReponseEvent启动发送请求循环

下面贴出安卓N版本ARTSPConnection是如何启动向服务端发送请求,接收服务端的响应这样一个循环的:    ==>void ARTSPConnection::postReceiveReponseEvent() {//mReceiveResponseEventPending条件变量一旦postReceiveReponseEvent被调用就设置为true,知道整个循环调用达到末端该m