UDP socket receive question

Hello...

Copying the minimalistic UDP receive example from the online Pickaxe I

require 'socket'
port = 12000
server = UDPSocket.open
server.bind(nil, port)
loop do
  text,sender = server.recvfrom(1024)
  puts text
end

localhost --> localhost UDP connections work fine

so I tried connecting 2 different boxes
check network connection by netcat:

  sender: echo "whatever" |netcat -u 192.168.x.y 12000
receiver: netcat -u -l -p 12000
connection is ok

receiver netcat and sender Ruby script work ok, too

but, with receiver Ruby (like above) neither sender netcat nor Ruby
script are able to make a transfer -> Ruby receiver drops pakets?!?

lsof shows a "UDP localhost:12000" binding, so everything should be ok
on the receiving side

Question:
I simply want a Ruby script collecting all UDP pakets arriving at a
specific port, above script only works for me localhost-->localhost
why?

ruby 1.8.2 (2004-07-16) [i686-linux] (aka pre1)

thanks for any hint, I'm out of ideas
Martin

Martin Pirker wrote:

Hello...

Copying the minimalistic UDP receive example from the online Pickaxe I

require 'socket'
port = 12000
server = UDPSocket.open
server.bind(nil, port)

               ^^^
Try a hostname here? You can use the string '<any>'. I guess that means any interface.

···

loop do
  text,sender = server.recvfrom(1024)
  puts text
end

localhost --> localhost UDP connections work fine

so I tried connecting 2 different boxes
check network connection by netcat:

  sender: echo "whatever" |netcat -u 192.168.x.y 12000
receiver: netcat -u -l -p 12000
connection is ok

receiver netcat and sender Ruby script work ok, too

but, with receiver Ruby (like above) neither sender netcat nor Ruby
script are able to make a transfer -> Ruby receiver drops pakets?!?

lsof shows a "UDP localhost:12000" binding, so everything should be ok
on the receiving side

Question:
I simply want a Ruby script collecting all UDP pakets arriving at a specific port, above script only works for me localhost-->localhost
why?

ruby 1.8.2 (2004-07-16) [i686-linux] (aka pre1)

thanks for any hint, I'm out of ideas
Martin

No. nil means bind to all interfaces. See getaddrinfo(3).

PGP.sig (186 Bytes)

···

On Oct 22, 2004, at 9:34 PM, Joel VanderWerf wrote:

Martin Pirker wrote:

Hello...
Copying the minimalistic UDP receive example from the online Pickaxe I
require 'socket'
port = 12000
server = UDPSocket.open
server.bind(nil, port)

              ^^^
Try a hostname here? You can use the string '<any>'. I guess that means any interface.

--
Eric Hodel - drbrain@segment7.net - http://segment7.net
All messages signed with fingerprint:
FEC2 57F1 D465 EB15 5D6E 7C11 332A 551C 796C 9F04

Eric Hodel wrote:

···

On Oct 22, 2004, at 9:34 PM, Joel VanderWerf wrote:

Martin Pirker wrote:

Hello...
Copying the minimalistic UDP receive example from the online Pickaxe I
require 'socket'
port = 12000
server = UDPSocket.open
server.bind(nil, port)

              ^^^
Try a hostname here? You can use the string '<any>'. I guess that means any interface.

No. nil means bind to all interfaces. See getaddrinfo(3).

Ok, but UDPSocket#bind accepts '<any>' as well. It appears (from brief groping in etx/socket/socket.c) that nil and '<any>' are synonyms. So substituting one for the other will not make a difference in the problem the OP was trying to fix.

but it does fix it

nil gives a "UDP localhost:12000" binding according to lsof

"<any>" and "" gives a "UDP *:12000" binding and appears to work as
expected => accepts any packet arriving from any sender at this port

question is, why I didn't find this myself?

I assumed nothing set aka nil means "don't bind to anything, accept
everything", so I just copied from the example
reading the "socket-level access" paragraph at the beginning points
one to "" as INADDR_ANY, but nowhere a word of "<any>" or a definiton
of nil ?

thanks! always nice&helpful ppl here,
Martin

···

Joel VanderWerf <vjoel@path.berkeley.edu> wrote:

Eric Hodel wrote:

On Oct 22, 2004, at 9:34 PM, Joel VanderWerf wrote:

Martin Pirker wrote:

Copying the minimalistic UDP receive example from the online Pickaxe I
require 'socket'
port = 12000
server = UDPSocket.open
server.bind(nil, port)

             ^^^
Try a hostname here? You can use the string '<any>'. I guess that
means any interface.

No. nil means bind to all interfaces. See getaddrinfo(3).

Ok, but UDPSocket#bind accepts '<any>' as well. It appears (from brief
groping in etx/socket/socket.c) that nil and '<any>' are synonyms. So
substituting one for the other will not make a difference in the problem
the OP was trying to fix.