develooper Front page | perl.libnet | Postings from November 2008

How to bind to specific interface with IO::Socket::Molticast?

From:
Josef Wolf
Date:
November 22, 2008 04:24
Subject:
How to bind to specific interface with IO::Socket::Molticast?
Message ID:
20081122122125.GD9676@raven.wolf.lan
Hello,

On a multi-homed host, I want to create a separate socket for each
multicast interface.  So I have come up with the solution attached
below. This solution works fine, except for one problem: if a packet
is received on the given multicast-group, this packet is received on
_all_ sockets and not only on the one that is bound to the receiving
port.

Any hints how to tell IO::Socket::Multicast that it should deliver
the packet only to the socket that listens on the receiving interface?

BTW: this is ubuntu-8.10 with Linux 2.6.27-7-generic

#! /usr/bin/perl

use strict;
use warnings;

use IO::Handle;
use IO::Select;
use IO::Socket::INET;
use IO::Socket::Multicast;
use IO::Interface::Simple;

my $rdfds = IO::Select->new();

my @ssdp_server;
foreach my $if (IO::Interface::Simple->interfaces) {
    my $adr=$if->address;
    next unless $adr =~ /^(192|172)/;
    next unless $if->is_multicast;

    print "$adr\n";
    my $socket = IO::Socket::Multicast->new (LocalAddr=>"239.255.255.250",
                                             LocalPort=>1900,
                                             ReuseAddr=>1) or die;
    $socket->mcast_add("239.255.255.250", $adr);
    $socket->mcast_if($adr);
    $socket->mcast_ttl(4);
    $socket->mcast_loopback(0);
    $rdfds->add($socket);
}

while (1) {
    my @ready=$rdfds->can_read (0);
    foreach my $fh (@ready) {
        print $fh->mcast_if, "\n";
        $fh->recv(my $data, 1024);
#        print "$data\n";
    }
}



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About