[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

UDP socket receive question

Martin Pirker

10/22/2004 11:56:00 PM

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
4 Answers

Joel VanderWerf

10/23/2004 4:34:00 AM

0

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


Eric Hodel

10/23/2004 5:05:00 PM

0

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).

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

Joel VanderWerf

10/23/2004 6:08:00 PM

0

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.


Martin Pirker

10/23/2004 6:50:00 PM

0

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.


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