vlc源码研究
有位传说中的大神告诉我,我的p2p打洞打不通是因为,sdp描述信息中的地址不对
也就是IN IP4 XXX.XXX.X.XXX这一句
我看到确实是个局域网地址,那么vlc在接收到IN IP4 XXX.XXX.X.XXX的时候到底是如何处理的呢,引起了我极大的好奇
一定要去源码里面找一下
在source insight 里面搜索了一下IN IP
接收肯定是从字符串里面解析东西,不是输入东西
所以估计在
Sap.c (modules\services_discovery): if (sscanf (sfilter, " incl IN IP%u %*s %255s ", &ipv,
Sap.c (modules\services_discovery): int res = sscanf (str, "IN IP%u %59[^/]/%u/%u", &fam, host, &n1, &n2);
Sap.c (modules\services_discovery): if ((sscanf (data, "%63s %"SCNu64" %"SCNu64" IN IP%u %1023s",
sap.c文件里面
static sdp_t *ParseSDP (vlc_object_t *p_obj, const char *psz_sdp)
里面有
switch (expect)
{
/* Session description */
case 'V': break; case 'O':
{
expect = 'S';
if (cat != 'o')
{
msg_Dbg (p_obj, "missing SDP originator");
goto error;
} if ((sscanf (data, "%63s %"SCNu64" %"SCNu64" IN IP%u %1023s",
p_sdp->username, &p_sdp->session_id,
&p_sdp->session_version, &p_sdp->orig_ip_version,
p_sdp->orig_host) != )
|| ((p_sdp->orig_ip_version != )
&& (p_sdp->orig_ip_version != )))
{
msg_Dbg (p_obj, "SDP origin not supported: %s", data);
/* Or maybe out-of-range, but this looks suspicious */
goto error;
}
EnsureUTF8 (p_sdp->orig_host);
break;
} case 'S':
{ break;
} case 'I':
{ break;
} case 'U':
expect = 'E';
if (cat == 'u')
break;
case 'E':
expect = 'E';
if (cat == 'e')
break;
case 'P':
expect = 'P';
if (cat == 'p')
break;
case 'C':
expect = 'B';
if (cat == 'c')
{
if (ParseSDPConnection (data, &glob_addr, &glob_len,
&glob_count))
{
msg_Dbg (p_obj, "SDP connection infos not supported: "
"%s", data);
goto error;
}
break;
}
所以这段sdp
Owner/Creator, Session Id (o): - IN IP4 192.168.1.146
被解析进了p_sdp->orig_host里面
另一段sdp
Connection Information (c): IN IP4 192.168.1.146
被ParseSDPConnection (data, &glob_addr, &glob_len, &glob_count)处理了,放入了glob_addr里面
再看这一段
case 'm':
media:
{
expect = 'i';
if (cat != 'm')
{
msg_Dbg (p_obj, "missing SDP media description");
goto error;
}
struct sdp_media_t *m;
m = realloc (p_sdp->mediav, (p_sdp->mediac + ) * sizeof (*m));
if (m == NULL)
goto error; p_sdp->mediav = m;
m += p_sdp->mediac;
p_sdp->mediac++; memset (m, , sizeof (*m));
memcpy (&m->addr, &glob_addr, m->addrlen = glob_len);
m->n_addr = glob_count;
最后被放进了p_sdp->mediav->addr 里面
所以要追踪p_sdp的动向
static int OpenDemux( vlc_object_t *p_this )
p_demux->p_sys->p_sdp = p_sdp;
vlc源码研究的更多相关文章
- OAuth2学习及DotNetOpenAuth部分源码研究
OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...
- Android开源项目 Universal imageloader 源码研究之Lru算法
https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...
- zepto源码研究 - zepto.js - 1
简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...
- VLC源码分析知识总结
1. 关于#和## 1.1).在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号. 比如在早 ...
- dubbo源码研究(一)
1. dubbo源码研究(一) 1.1. dubbo启动加载过程 我们知道,现在流行注解方式,用spring管理服务,dubbo最常用的就是@Reference和@Service了,那么我首先找到这两 ...
- 【JavaScript】$.extend使用心得及源码研究
最近写多了js的面向对象编程,用$.extend写继承写得很顺手.但是在使用过程中发现有几个问题. 1.深拷贝 $.extend默认是浅拷贝,这意味着在继承复杂对象时,对象中内嵌的对象无法被拷贝到. ...
- underscore.js源码研究(8)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(7)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码研究(6)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
随机推荐
- PAT 1002. A+B for Polynomials (25) 简单模拟
1002. A+B for Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue T ...
- PHP 字符串转 bigint 型md5
1 2 3 4 5 6 7 8 /** * 字符串转bigint * @return bigint(string) */ public function md5( ...
- PHP 使用redis实现秒杀
PHP 使用redis实现秒杀 使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是) 先将商品库存如队 ...
- oracle和mysql几点差异对比
Oracle与mysql差异性总结 之前有个项目是用oracle数据库进行开发,需要把数据库改成mysql,遇到了一些地方需要注意的,就简单记了下来. 备注: 再把oracle转成mysql的时候,表 ...
- zeppelin0.7.3源码编译
操作系统: Centos7.X Python版本: Python2.7 Maven版本:3.1.* Git:1.8.3.* JAVA:java1.7+ node npm bower grunt 每次执 ...
- 使用hiredis实现pipeline方式访问
1.介绍 hiredis: 一个c/c++的访问redis的api库 地址:https://github.com/redis/hiredis pipeline方式: redis中的pipeline方式 ...
- 【Struts2的执行流程,这个博主写的很详细】
http://blog.csdn.net/wjw0130/article/details/46371847
- js 继承的简单易懂小例子
js 继承 今天主要说原型链继承.构造继承.组合继承三种常用继承方式,分享一下我的理解. 原型链继承例子1 //原型继承function A(name){ this.name = name;}func ...
- Testin云測试破7000万次:崩溃成90%手游应用质量难题
Testin云測试破7000万次:崩溃成90%手游应用质量难题 2014/11/13 · Testin · 业界资讯 11月13日.全球最大的移动游戏.应用真机和用户云測试平台Testin云測宣布,已 ...
- BIRT实现组内跨行计算
问题来源:http://developer.actuate.com/community/forum/index.php?/topic/36160-dealing-with-previous-rows- ...