mirror of https://github.com/sipwise/rtpengine.git
59 lines
1.0 KiB
59 lines
1.0 KiB
package NGCP::Rtpengine;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Socket;
|
|
use Socket6;
|
|
use IO::Socket;
|
|
use IO::Socket::IP;
|
|
use Bencode;
|
|
use Data::Dumper;
|
|
|
|
sub new {
|
|
my ($class, $addr, $port) = @_;
|
|
|
|
my $self = {};
|
|
bless $self, $class;
|
|
|
|
if (ref($addr)) {
|
|
$self->{socket} = $addr;
|
|
}
|
|
else {
|
|
$self->{socket} = IO::Socket::IP->new(Type => &SOCK_DGRAM, Proto => 'udp',
|
|
PeerHost => $addr, PeerPort => $port);
|
|
}
|
|
|
|
return $self;
|
|
}
|
|
|
|
sub req {
|
|
my ($self, $packet) = @_;
|
|
|
|
my $cookie = rand() . ' ';
|
|
my $p = $cookie . Bencode::bencode($packet);
|
|
$self->{socket}->send($p, 0) or die $!;
|
|
my $ret;
|
|
$self->{socket}->recv($ret, 65535) or die $!;
|
|
$ret =~ s/^\Q$cookie\E//s or die $ret;
|
|
my $resp = Bencode::bdecode($ret, 1);
|
|
|
|
$resp->{result} or die Dumper $resp;
|
|
|
|
if ($resp->{result} eq 'error') {
|
|
die "Error reason: \"$resp->{'error-reason'}\"";
|
|
}
|
|
|
|
return $resp;
|
|
}
|
|
|
|
sub offer {
|
|
my ($self, $packet) = @_;
|
|
return $self->req( { command => 'offer', %$packet } );
|
|
}
|
|
sub answer {
|
|
my ($self, $packet) = @_;
|
|
return $self->req( { command => 'answer', %$packet } );
|
|
}
|
|
|
|
1;
|