Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Simple daemon which can speak and listen

Reply
Thread Tools

Simple daemon which can speak and listen

 
 
Sai Hl
Guest
Posts: n/a
 
      02-26-2009
Hi all. According to you, what could be the more sexy way to write a
simple Ruby daemon (version 1.9 ) which can speak and listen in the
same time on a socket (UDP in my case)?

Thanks,
Sai
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Michael Malone
Guest
Posts: n/a
 
      02-26-2009
sock = UDPSocket.new
Thread.new do
sock.write("some string")
end
puts sock.read

However, does it _really_ need to be at the same time? can it not just
take turns? If you're trying to do two things at the same time on the
same object, it suggests you need two objects. Just a thought

Sai Hl wrote:
> Hi all. According to you, what could be the more sexy way to write a
> simple Ruby daemon (version 1.9 ) which can speak and listen in the
> same time on a socket (UDP in my case)?
>
> Thanks,
> Sai
>

 
Reply With Quote
 
 
 
 
Brian Candler
Guest
Posts: n/a
 
      02-27-2009
Sai Hl wrote:
> Hi all. According to you, what could be the more sexy way to write a
> simple Ruby daemon (version 1.9 ) which can speak and listen in the
> same time on a socket (UDP in my case)?


More sexy than what - have you written something already? If so, post it
and we'll look.

Docs you need:
http://www.ruby-doc.org/stdlib/libdoc/socket/rdoc/
http://www.ruby-doc.org/docs/Program...b_network.html

The first of these is unfortunately incomplete, e.g. UDPSocket#send is
missing. However the second has everything you need under the UDPSocket
header.

A normal UDP server would typically have a loop where it waits for a
message, processes it, and then sends back a response to the sender.
e.g.

require 'socket'
sock = UDPSocket.new
sock.bind(Socket.gethostname, 12345)
loop do
packet, sender = sock.recvfrom(1500)
response = "hello #{packet}"
sock.send response, 0, sender[3], sender[1]
end

Test like this in another window:

$ irb
irb(main):001:0> require 'socket'
=> true
irb(main):002:0> s = UDPSocket.new
=> #<UDPSocket:0xb7d5adec>
irb(main):003:0> s.connect Socket.gethostname, 12345
=> 0
irb(main):004:0> s.send "world", 0
=> 5
irb(main):005:0> s.recvfrom(1500)
=> ["hello world", ["AF_INET", 12345, "example.com", "192.0.2.1"]]

There's nothing to stop you sending out packets asynchronously on the
same UDPSocket though, if you want to, and this can even be done in
another thread.

So if the processing of one particular packet might take a variable
amount of time, and you still want to receive and process other packets
in the mean time, you could do something like this (untested):

...
sock.bind(Socket.gethostname, 12345)
loop do
d1, d2 = sock.recvfrom
Thread.new(d1, d2) do |packet, sender|
... process 'packet'
... use sock.send to send the response to 'sender'
end
end

Note the use of arguments in Thread.new(...) to pass copies of the local
variables to the thread. If you used d1 and d2 directly, you'd find that
they changed as soon as another packet was received in the main loop,
which leads to some nasty bugs when packets arrive at a fast rate.

So it's probably safer to write it like this:

Thread.new(*sock.recvfrom) do |packet, sender|
... etc
end

Setting Thread.abort_on_exception = true is helpful when debugging this
sort of code, otherwise when an exception occurs in the thread it just
dies silently.

HTH,

Brian.
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Eleanor McHugh
Guest
Posts: n/a
 
      02-27-2009
On 26 Feb 2009, at 22:15, Sai Hl wrote:
> Hi all. According to you, what could be the more sexy way to write a
> simple Ruby daemon (version 1.9 ) which can speak and listen in the
> same time on a socket (UDP in my case)?
>
> Thanks,
> Sai


Follow the link in my sig and you'll find a couple of presentations
with examples of all kinds of Ruby socket fun, covering both UDP and
TCP. They also include lots of code which may or may not be fit for
production purposes


Ellie

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



 
Reply With Quote
 
Sai Hl
Guest
Posts: n/a
 
      02-27-2009
Totaly awsome
Thank you all!
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: PEP 3143: Standard daemon process library (was: Writing awell-behaved daemon) Floris Bruynooghe Python 1 03-24-2009 02:58 PM
Re: PEP 3143: Standard daemon process library (was: Writing awell-behaved daemon) Jean-Paul Calderone Python 0 03-20-2009 01:02 PM
Daemon Win32::Daemon; ph1975@gmail.com Perl Misc 0 09-07-2006 10:58 AM
[ANN] 1337 Speak For Ruby and an ActiveRecord 1337 Speak Extension- 0.0.1 zdennis Ruby 1 08-11-2006 02:54 AM
Bad ServerSocket ! Listen! Listen! Listen! Donny Java 13 08-05-2004 06:51 PM



Advertisments