[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Gets the broadcast address of an IP address

Cyril Beer

2/28/2009 4:21:00 PM

Hi Ruby communauty. I am trying to broadcast a message using UDPSocket
on destination port 10000. My code is:

client = UDPSocket.new
client.connect Socket.gethostname, 10000
client.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
client.send data, 0

But my packet is not a broadcast, its address is the same as my host:
192.168.0.101

In order to do so on the external interface of my system (named en0), I
had remplaced this:
client.connect Socket.gethostname, 10000
by this:
client.connect "192.168.0.255", 10000

And now this is working. But is there a way to get automatically the
"192.168.0.255" address thanks to a Ruby method? I know I can get my IP
with IPSocket.getaddress(Socket.gethostname) but I don't see any way to
gets its broadcast address.

Thanks
--
Posted via http://www.ruby-....

5 Answers

Eleanor McHugh

2/28/2009 7:12:00 PM

0

On 28 Feb 2009, at 16:20, Sai Hl wrote:
> Hi Ruby communauty. I am trying to broadcast a message using
> UDPSocket
> on destination port 10000. My code is:
>
> client = UDPSocket.new
> client.connect Socket.gethostname, 10000
> client.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
> client.send data, 0
>
> But my packet is not a broadcast, its address is the same as my host:
> 192.168.0.101
>
> In order to do so on the external interface of my system (named
> en0), I
> had remplaced this:
> client.connect Socket.gethostname, 10000
> by this:
> client.connect "192.168.0.255", 10000
>
> And now this is working. But is there a way to get automatically the
> "192.168.0.255" address thanks to a Ruby method? I know I can get
> my IP
> with IPSocket.getaddress(Socket.gethostname) but I don't see any way
> to
> gets its broadcast address.
>
> Thanks


The simplest way to do it is to use a regex to change the last term in
the quad:

IPSocket.getaddress(Socket.gethostname).gsub!(/.\d{1,3}$/, '.255')


Ellie

Eleanor McHugh
Games With Brains
http://slides.games-with-...
----
raise ArgumentError unless @reality.responds_to? :reason



Hassan Schroeder

2/28/2009 10:49:00 PM

0

On Sat, Feb 28, 2009 at 11:12 AM, Eleanor McHugh
<eleanor@games-with-brains.com> wrote:

>> ... But is there a way to get automatically the
>> "192.168.0.255" address thanks to a Ruby method? =A0I know I can get my =
IP
>> with IPSocket.getaddress(Socket.gethostname) but I don't see any way to
>> gets its broadcast address.

> The simplest way to do it is to use a regex to change the last term in th=
e
> quad:
>
> IPSocket.getaddress(Socket.gethostname).gsub!(/.\d{1,3}$/, '.255')

Simple but not necessarily correct :-)

<http://learn-networking.com/network-design/how-a-broadcast-address...

FWIW,
--=20
Hassan Schroeder ------------------------ hassan.schroeder@gmail.com

Eleanor McHugh

2/28/2009 11:22:00 PM

0

On 28 Feb 2009, at 22:49, Hassan Schroeder wrote:
> On Sat, Feb 28, 2009 at 11:12 AM, Eleanor McHugh
> <eleanor@games-with-brains.com> wrote:
>
>>> ... But is there a way to get automatically the
>>> "192.168.0.255" address thanks to a Ruby method? I know I can get
>>> my IP
>>> with IPSocket.getaddress(Socket.gethostname) but I don't see any
>>> way to
>>> gets its broadcast address.
>
>> The simplest way to do it is to use a regex to change the last term
>> in the
>> quad:
>>
>> IPSocket.getaddress(Socket.gethostname).gsub!(/.\d{1,3}$/, '.255')
>
> Simple but not necessarily correct :-)
>
> <http://learn-networking.com/network-design/how-a-broadcast-add...
> >

True, but I'm not sure the general case is so easy on the eye ;p

subnet_mask = [ 255, 255, 255, 0 ]
IPSocket
getaddress(Socket.gethostname).split('.').zip(subnet_mask).collect { |
(i, m)| ((~m) & 255) | i.to_i }.join(".")


Ellie

Eleanor McHugh
Games With Brains
http://slides.games-with-...
----
raise ArgumentError unless @reality.responds_to? :reason



Brian Candler

3/1/2009 9:12:00 PM

0

Eleanor McHugh wrote:
> On 28 Feb 2009, at 22:49, Hassan Schroeder wrote:
>>> The simplest way to do it is to use a regex to change the last term
>>> in the
>>> quad:
>>>
>>> IPSocket.getaddress(Socket.gethostname).gsub!(/.\d{1,3}$/, '.255')
>>
>> Simple but not necessarily correct :-)
>>
>> <http://learn-networking.com/network-design/how-a-broadcast-add...
>> >
>
> True, but I'm not sure the general case is so easy on the eye ;p

This is messier than it should be, but:

require 'ipaddr'
n = IPAddr.new("192.168.0.101/24")
p n | (~n.instance_variable_get(:@mask_addr) & IPAddr::IN4MASK)

Or maybe you could just broadcast to the all-ones address
(255.255.255.255)
--
Posted via http://www.ruby-....

Cyril Beer

3/1/2009 11:01:00 PM

0

Brian Candler wrote:
> This is messier than it should be, but:
>
> require 'ipaddr'
> n = IPAddr.new("192.168.0.101/24")
> p n | (~n.instance_variable_get(:@mask_addr) & IPAddr::IN4MASK)
>
> Or maybe you could just broadcast to the all-ones address
> (255.255.255.255)

Yes, I had use the broadcast address ;)
Finaly it's simple and efficient. But I think I will try your first
solution after to.

Thanks
--
Posted via http://www.ruby-....