File: sendPacket.pl

package info (click to toggle)
udpcast 20120424-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, forky, sid, stretch, trixie
  • size: 876 kB
  • ctags: 1,011
  • sloc: ansic: 7,713; sh: 2,838; perl: 227; makefile: 114
file content (74 lines) | stat: -rwxr-xr-x 1,465 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/perl
# Written by Alain Knaff

# Small test program to send messages to an UDP port

use strict;

use IO::Socket::INET;
use Getopt::Std;
use English;
use vars qw($opt_p $opt_i $opt_f $opt_h $opt_I);

getopts("p:i:f:hI:");

if(defined $opt_h) {
  die "Usage: $0 -h [-p port] [-i ip] [-f file] [-I mcast_interface]\n";
}

if(!defined $opt_p) {
    die "Port (-p) missing\n";
}

if(!defined $opt_i) {
    $opt_i = '127.0.0.1';
}

my $data;
if(defined $opt_f) {
    open(DATA, "<$opt_f") || die "Could not open $opt_f ($ERRNO)\n";
    sysread(DATA, $data, 64000);
    close(DATA);
} else {
    $data=$ARGV[0];
}

my $sock = 
    new IO::Socket::INET(Proto => 'udp');
if(!defined $sock) {
    die "Could not open socket at port $opt_p ($ERRNO)\n";
}

sub fill_mreq {
  my ($mcast, $if) = @_;

  my $mreq;
  if($if =~ /^([0-9.]*)$/) {
    $mreq = pack("a4C4i", $mcast, split(/\./, $if),0);
  } else {
    my $idx = pack("a16i",$if,0);
    # SIOCGIFINDEX 0x8933
    if(!defined ioctl($sock, 0x8933, $idx)) {
      die "Interface $if not found\n";
    }
    my ($name, $n) = unpack("a16i", $idx);
    $mreq = pack("a4ii", $mcast,0,$n);
  }

  return $mreq;
}



my $iaddr = gethostbyname($opt_i);
my $toAddr = sockaddr_in($opt_p, $iaddr);
if(defined $opt_I) {
  my $mreq=fill_mreq($iaddr, $opt_I);
  # IPPROTO_IP = 0
  # IP_MULTICAST_IF = 32
  $sock->setsockopt(0, 32, $mreq) ||
    die "ERROR: setsockopt: $!\n";
}
my $ret = $sock->send($data, 0, $toAddr);

1;