Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sip RTP SSRC:如何知道呼叫方向_Sip_Rtp_Jnetpcap_Call Flow - Fatal编程技术网

Sip RTP SSRC:如何知道呼叫方向

Sip RTP SSRC:如何知道呼叫方向,sip,rtp,jnetpcap,call-flow,Sip,Rtp,Jnetpcap,Call Flow,我正在使用jNetPcap从tcpdump解码rtp。目前,我使用SIP Invite消息和源IP,并通过源IP进行检查。。要检测前进方向,请从呼叫中反转。。这是可行的,但实际上并不是按照rfc标准以及围绕所有可能的行为而工作 有没有办法从SSRC中确定源在sip调用中的工作方向? 就我所见,ssrc标识符第一次出现在rtp流上,我无法说出它是哪个调用流方向 我不想同时保存两个方向并让用户决定它是哪个方向。我做了脏解析,但jnetpcap似乎没有更好的方法来做到这一点: private clas

我正在使用jNetPcap从tcpdump解码rtp。目前,我使用SIP Invite消息和源IP,并通过源IP进行检查。。要检测前进方向,请从呼叫中反转。。这是可行的,但实际上并不是按照rfc标准以及围绕所有可能的行为而工作

有没有办法从SSRC中确定源在sip调用中的工作方向? 就我所见,ssrc标识符第一次出现在rtp流上,我无法说出它是哪个调用流方向


我不想同时保存两个方向并让用户决定它是哪个方向。

我做了脏解析,但jnetpcap似乎没有更好的方法来做到这一点:

private class JPacketHandlerSSRCs implements JPacketHandler<String> {

    @Override
    public void nextPacket(JPacket packet, String user) {
        // TODO Auto-generated method stub

        Udp udp = new Udp();
        Rtp rtp = new Rtp();
        Sdp sdp = new Sdp();
        Sip sip = new Sip();

        // get the source ip of the caller from the invite message.
        // seems to be a tricky and dirty workaround, poor jnetpcap framework!
        if(packet.hasHeader(sip) && packet.hasHeader(sdp)) {

            if( (sip.getUTF8String(0, '@')).startsWith("INVITE ") ) {
                String sdptext = sdp.text();
                int pos = sdptext.indexOf("m=audio ") + 8;
                int end = pos;
                if(pos != -1)
                    while(sdptext.charAt(end) != ' ') end++;

                rtp_forward_channel_port = Integer.parseInt(sdptext.substring(pos, end));
                }
        }



        if(packet.hasHeader(udp))
            if(rtp_forward_channel_port == udp.source() && packet.hasHeader(rtp)) {
            try {
                dos = getOutputStream(rtp.ssrc());
                dos.write(rtp.getPayload());
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
    }

我进行了肮脏的解析,但jnetpcap似乎没有更好的方法:

private class JPacketHandlerSSRCs implements JPacketHandler<String> {

    @Override
    public void nextPacket(JPacket packet, String user) {
        // TODO Auto-generated method stub

        Udp udp = new Udp();
        Rtp rtp = new Rtp();
        Sdp sdp = new Sdp();
        Sip sip = new Sip();

        // get the source ip of the caller from the invite message.
        // seems to be a tricky and dirty workaround, poor jnetpcap framework!
        if(packet.hasHeader(sip) && packet.hasHeader(sdp)) {

            if( (sip.getUTF8String(0, '@')).startsWith("INVITE ") ) {
                String sdptext = sdp.text();
                int pos = sdptext.indexOf("m=audio ") + 8;
                int end = pos;
                if(pos != -1)
                    while(sdptext.charAt(end) != ' ') end++;

                rtp_forward_channel_port = Integer.parseInt(sdptext.substring(pos, end));
                }
        }



        if(packet.hasHeader(udp))
            if(rtp_forward_channel_port == udp.source() && packet.hasHeader(rtp)) {
            try {
                dos = getOutputStream(rtp.ssrc());
                dos.write(rtp.getPayload());
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
    }

无法仅从RTP流确定哪一方进行了呼叫。您需要捕获INVITE/200/ACK交换,以便将IP地址/端口/传输三元组映射到呼叫的参与者。听起来你已经在这么做了


我不确定你的意思,但不知道它是如何从rfc标准工作的。RTP和SIP标准似乎都在做他们应该做的事情。SIP使用SDP将自己与直接了解媒体平面隔离开来,从而允许SIP使用任意媒体协议。

无法仅从RTP流确定呼叫方。您需要捕获INVITE/200/ACK交换,以便将IP地址/端口/传输三元组映射到呼叫的参与者。听起来你已经在这么做了


我不确定你的意思,但不知道它是如何从rfc标准工作的。RTP和SIP标准似乎都在做他们应该做的事情。SIP使用SDP将自己与直接了解媒体平面隔离开来,从而允许SIP使用任意媒体协议。

我的第二篇文章和代码按预期工作。我在第一篇文章中的意思是,我的第一个方法是捕获邀请并获取源IP。并查看所有sip消息(如果提供了任何新的VIA):以了解调用方的源ip是否已更改。它起作用了,但我无法确定这种方法是否只是我在许多调用中发现的一种行为,因此我最好将sdp的媒体端口与邀请消息联系起来,反之亦然。我的第二篇文章和代码按预期工作。我在第一篇文章中的意思是,我的第一个方法是捕获邀请并获取源IP。并查看所有sip消息(如果提供了任何新的VIA):以了解调用方的源ip是否已更改。它起作用了,但我无法确定这种方法是否只是我在许多调用中发现的一种行为,因此我最好将sdp的媒体端口与邀请消息联系起来,反之亦然。