Chinaunix首页 | 论坛 | 博客
  • 博客访问: 430006
  • 博文数量: 77
  • 博客积分: 2948
  • 博客等级: 少校
  • 技术积分: 912
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-16 15:34
文章分类

全部博文(77)

文章存档

2014年(9)

2013年(9)

2011年(26)

2010年(33)

分类: LINUX

2013-10-29 09:45:59

原文地址:ipnc_dm36x的boa工作流程 作者:akls_21

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])来指定。

 

2boa中的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才释放。

3GetAVData接口中几个宏定义的含义:



阅读(1267) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~