vlc源码研究

有位传说中的大神告诉我,我的p2p打洞打不通是因为,sdp描述信息中的地址不对

也就是IN IP4 XXX.XXX.X.XXX这一句

我看到确实是个局域网地址,那么vlc在接收到IN IP4 XXX.XXX.X.XXX的时候到底是如何处理的呢,引起了我极大的好奇

一定要去源码里面找一下

在source insight 里面搜索了一下IN IP

接收肯定是从字符串里面解析东西,不是输入东西

所以估计在

Sap.c (modulesservices_discovery):            if (sscanf (sfilter, " incl IN IP%u %*s %255s ", &ipv,
Sap.c (modulesservices_discovery):    int res = sscanf (str, "IN IP%u %59[^/]/%u/%u", &fam, host, &n1, &n2);
Sap.c (modulesservices_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) != 5)
                 || ((p_sdp->orig_ip_version != 4)
                  && (p_sdp->orig_ip_version != 6)))
                {
                    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): - 1502808625152723 1502808625152723 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 + 1) * sizeof (*m));
                if (m == NULL)
                    goto error;

                p_sdp->mediav = m;
                m += p_sdp->mediac;
                p_sdp->mediac++;

                memset (m, 0, 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;
原文地址:https://www.cnblogs.com/baldermurphy/p/7367666.html