ipnc_dm36x的boa工作流程
1、首先boa中初始化三张哈希表, if (hash_table_init() < 0) if(arg_hash_table_init()
< 0) if(uri_hash_table_init() <
0),其中哈希表 if (hash_table_init() <
0) if(arg_hash_table_init() < 0)需要根据哈希表if(uri_hash_table_init()
< 0)来找到其执行函数,在该函数中再根据这两张哈希表找到其真正的执行函数。其中int ret = (*req->http_uri->handler)(req);执行函数时哈希表if(uri_hash_table_init()
< 0)中的执行函数,而另两张哈希表的执行函数通过函数指针(*option->handler) (req, &arg[i])来指定。
2、boa中的request连接为短链接,每来一个请求就建立一个request连接,请求执行完之后释放该request结构体,该request链表无优先级的限制,只会轮询执行request请求,判断request是否释放的标志是retval变量,那么为什么客户端连接后只是发送一个
/ipcam/avc.cgi HTTP/1.1请求,可以获取连续的视频流,可以看到通过哈希表查找到其执行函数只是获取了一个I帧数据,这是确保获取第一帧图像时不花屏,之后没有操作了,那连续获取视频流的操作在哪里呢?这还要通过boa解析request流程来分析,boa在解析request_header,request_body之后还要将结构返回给client socket,该部分在函数process_get中实现,在该函数中一般的控制request将返回值正确写到client socket后返回 req->status = DEAD;return 0;而视频请求则通过http_stream判断请求流类型,之后调用GetAVData来获得一帧数据,并返回return 1,说明该连接请求并没有结束,boa继续轮询该request,从而获得连续的视频流。知道客户端退出时,该视频请求request才释放。
3、GetAVData接口中几个宏定义的含义: