Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: UDP-Broadcast with socket

by puudeli (Pilgrim)
on Jan 12, 2009 at 19:32 UTC ( #735781=note: print w/ replies, xml ) Need Help??


in reply to UDP-Broadcast with socket

You really shouldn't send broadcasts since they clutter the network and can be considered intrusive. If you have a valid reason to use broadcasts you really should open a socket for sending with INADDR_BROADCAST. On the server side you can catch the broadcasts by listening to the broadcast address or INADDR_ANY.

--
seek $her, $from, $everywhere if exists $true{love};


Comment on Re: UDP-Broadcast with socket
Download Code
Re^2: UDP-Broadcast with socket
by strat (Canon) on Jan 12, 2009 at 21:50 UTC

    Thank you very much

    I followed your advice, but somehow the send doesn't reach the server (on the same host). The network is fine, and Ikegamis script works perfect (except that it is not broadcasting).

    server.pl:

    #! /usr/bin/perl use warnings; use strict; use Socket qw(:all); $|++; # no suffering from buffering my $udp_port = 9999; socket( UDPSOCK, PF_INET, SOCK_DGRAM, getprotobyname('udp') ) or die " +socket: $!"; select( ( select(UDPSOCK), $|=1 )[0] ); # no suffering from buffering setsockopt( UDPSOCK, SOL_SOCKET, SO_REUSEADDR, 1 ) or die "setsockopt SO_REUSEADDR: $!"; #setsockopt( UDPSOCK, SOL_SOCKET, SO_BROADCAST, 1 ) # or die "setsockopt SO_BROADCAST: $!"; # my $broadcastAddr = sockaddr_in( $udp_port, INADDR_BROADCAST ); my $broadcastAddr = sockaddr_in( $udp_port, INADDR_ANY ); bind( UDPSOCK, $broadcastAddr ) or die "bind failed: $!\n"; my $input; while( my $addr = recv( UDPSOCK, $input, 4096, 0 ) ) { print "$addr => $input\n"; }

    Client.pl

    #! /usr/bin/perl use warnings; use strict; use Socket qw(:all); use POSIX ":sys_wait_h"; socket( SOCKET, PF_INET, SOCK_DGRAM, getprotobyname("udp") ) or die "Error: can't create an udp socket: $!\n"; select( ( select(SOCKET), $|=1 )[0] ); # no suffering from buffering my $broadcastAddr = sockaddr_in( 9999, INADDR_BROADCAST ); setsockopt( SOCKET, SOL_SOCKET, SO_BROADCAST, 1 ); send( SOCKET, "a" x 4096, 0, $broadcastAddr ) or die "Error at sendding: $!\n"; close SOCKET;

    Does anybody know what I'm doing wrong?

    My friend intends to use broadcasts to announce a new server going online to a central service. He won't misuse it. I am interested in this topic, because I know a little bit about TCP/IP, but have hardly any knowledge about UDP and broadcasts.

    Best regards,
    perl -e "s>>*F>e=>y)\*martinF)stronat)=>print,print v8.8.8.32.11.32"

      I followed your advice, but somehow the send doesn't reach the server (on the same host). The network is fine, and Ikegamis script works perfect (except that it is not broadcasting).

      I believe on linux, you need to have root priviledges to use UDP broadcast, try running it as root.


      I'm not really a human, but I play one on earth Remember How Lucky You Are
      Does anybody know what I'm doing wrong?

      Knowing I am not doing, just guessing. Your scripts works fine on my box, Fedora7 with perl 5.8.8, I have verified that via capturing the traffic with wireshark. Have you checked your iptables (or firewall) settings?

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://735781]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (8)
As of 2014-08-22 22:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (168 votes), past polls