#!/usr/bin/perl

# send sip options
# expect something back
# jkister 2019082901

use strict;
use IO::Socket;
use Getopt::Long;

my %opt;
GetOptions( \%opt, 'Debug',
                   'host=s',
                   'port=i',
                   'user=s',
                   'useragent=s',
          );
                   
$opt{host}       || die "specify --host <host>\n";
$opt{port}       ||= 5060;
$opt{user}       ||= 'jksipopt';
$opt{useragent}  ||= 'jksipopt/0.1';

$|=1;
my $sock = IO::Socket::INET->new(PeerAddr  => $opt{host},
                                 PeerPort  => $opt{port},
                                 ReuseAddr => 1,
                                 Proto     => 'udp',
                                ) or die "socket error: $!\n";

$sock->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 5, 0)) or die "setsockopt: $!\n";

my $localport = $sock->sockport();
my $localhost = $sock->sockhost();
my $peerport  = $sock->peerport();
my $peerhost  = $sock->peerhost();

my $msg = <<__END__;
OPTIONS sip:$opt{user}\@$peerhost:$peerport SIP/2.0
Via: SIP/2.0/UDP $localhost:$localport;branch=B0663D265
Contact: <sip:$opt{user}\@$localhost:$localport>
From: <sip:$opt{user}\@$localhost:$localport>;tag=B0663D265
To: <sip:$opt{user}\@$peerhost:$peerport>
Call-ID: B0663D265\@$opt{useragent}
CSeq: 1 OPTIONS
User-Agent: $opt{useragent}
Content-Length: 0

__END__

warn "**** SEND: [", $msg, "]\n" if $opt{Debug};
$msg =~ s/\x0D?\x0A/\x0D\x0A/g;

$sock->send($msg) or die "send error: $!\n";

$sock->recv(my $pkt, 4096) or die "Recv error: $!\n";
print "**** RECV: [",
      $pkt,
      "]\n";
