有位传说中的大神告诉我,我的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源码研究的更多相关文章

  1. OAuth2学习及DotNetOpenAuth部分源码研究

    OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...

  2. Android开源项目 Universal imageloader 源码研究之Lru算法

    https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...

  3. zepto源码研究 - zepto.js - 1

    简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...

  4. VLC源码分析知识总结

    1.  关于#和## 1.1).在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号. 比如在早 ...

  5. dubbo源码研究(一)

    1. dubbo源码研究(一) 1.1. dubbo启动加载过程 我们知道,现在流行注解方式,用spring管理服务,dubbo最常用的就是@Reference和@Service了,那么我首先找到这两 ...

  6. 【JavaScript】$.extend使用心得及源码研究

    最近写多了js的面向对象编程,用$.extend写继承写得很顺手.但是在使用过程中发现有几个问题. 1.深拷贝 $.extend默认是浅拷贝,这意味着在继承复杂对象时,对象中内嵌的对象无法被拷贝到. ...

  7. underscore.js源码研究(8)

    概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...

  8. underscore.js源码研究(7)

    概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...

  9. underscore.js源码研究(6)

    概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...

随机推荐

  1. Django学习(1)一首情诗

    Django是Python中Web开发的最有代表性的框架之一.本文将简单介绍如何入门Django开发. 首先确保你的linux系统已安装django模块.打开Python3,利用以下命令可找到djan ...

  2. java桌面程序打包教程

    首先打包成j可执行的jar文件. . 接下来找到自己生成jar文件的路径就可以看到jar文件了,我的是在桌面: 在桌面新建一个文件夹(名字随便取,一般去项目名字) 上面是我取的文件夹名字,然后把资料文 ...

  3. 自动类型安全的.NET标准REST库refit

    在SCOTT HANSELMAN 博客上看到一个好东西<Exploring refit, an automatic type-safe REST library for .NET Standar ...

  4. SSIS中循环遍历组件[Foreach Loop Container]

    背景 每月给业务部门提取数据,每个分公司都要提取一般,先跑SQL,再粘贴到Excel中,然后发邮件给相关的人员.费时费力,还容易粘贴错位.因此,需要通过一个程序完成这些步骤.我首先想到的是通过SSIS ...

  5. TortoiseSVN的安装和使用

    TortoiseSVN是windows平台下Subversion的免费开源client. 一般我们都是先讲讲server的配置.然后再讲client的使用,可是在TortoiseSVN上.却能够反过来 ...

  6. 项目实战13—企业级虚拟化Virtualization-KVM技术

    项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html KVM的介绍.准备工作和qemu-kvm 命令详解 1.介绍 (1)介绍 KVM:就 ...

  7. ABP框架 - 规约

    文档目录 本节内容: 简介 示例 创建规约类 在仓储里使用规约 组合规约 讨论 何时使用 何时不用 简介 规约模式是一个特别的软件设计模式,业务逻辑可以使用boolean逻辑重新链接业务逻辑(维基百科 ...

  8. 六.Spring与RabbitMQ集成--stock trading(股票交易系统)

    周末继续写博客,算起来,关于rabbitMQ这个中间件的研究已经持续至两个星期了,上一篇文章使用sring amqp实现了同步和异步的消息接收功能.这一节继续实用spring amqp实现一个股票交易 ...

  9. tomcat启动失败的一种可能性

    今天搭建一个新的项目,采用spring+hibernate框架,项目框架搭建完成以后,启动tomcat,报错,如下图. 第一反应是tomcat的问题,于是clean了tomcat,没用,再把tomca ...

  10. Linux查看系统信息(CentOS 7中测试通过)

    以下命令运载CentOS7中测试通过 Linux查看服务器系统信息 CentOS版本 [root@blog ~]# cat /etc/os-release NAME="CentOS Linu ...