[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Socket send functions only allow you to send strings?

Ryan Parmeter

9/4/2007 10:53:00 PM

I am writing a small TimeP (RFC 868) server to sync time with some
networking equipment. The equipment that shall go nameless requires the
use of UDP.

As far as I can tell, my only option to write to a UDPSocket is to use
the send method, which takes a string. I need to send a 32bit integer
representing the date in a UDP packet and I'd love to use something
like:

myUDPsocket.send( Time.now.to_i, 0, host, port)

In my situation I can't change the receiving program to accept a string
or I could do it that way. I can't convert the integer to a string
either because that would blow my 32 bit requirement. Does anyone have
any idea?


~Parkingmeter
--
Posted via http://www.ruby-....

4 Answers

Patrick Hurley

9/4/2007 11:00:00 PM

0

On 9/4/07, Ryan Parmeter <parkingmeter@gmail.com> wrote:
> I am writing a small TimeP (RFC 868) server to sync time with some
> networking equipment. The equipment that shall go nameless requires the
> use of UDP.
>
> As far as I can tell, my only option to write to a UDPSocket is to use
> the send method, which takes a string. I need to send a 32bit integer
> representing the date in a UDP packet and I'd love to use something
> like:
>
> myUDPsocket.send( Time.now.to_i, 0, host, port)
>
> In my situation I can't change the receiving program to accept a string
> or I could do it that way. I can't convert the integer to a string
> either because that would blow my 32 bit requirement. Does anyone have
> any idea?
>
>
> ~Parkingmeter
> --
> Posted via http://www.ruby-....
>
>

Try

ri Array#pack

[number].pack('i')

should do the trick.
pth

Joel VanderWerf

9/4/2007 11:06:00 PM

0

Ryan Parmeter wrote:
> I am writing a small TimeP (RFC 868) server to sync time with some
> networking equipment. The equipment that shall go nameless requires the
> use of UDP.
>
> As far as I can tell, my only option to write to a UDPSocket is to use
> the send method, which takes a string. I need to send a 32bit integer
> representing the date in a UDP packet and I'd love to use something
> like:
>
> myUDPsocket.send( Time.now.to_i, 0, host, port)
>
> In my situation I can't change the receiving program to accept a string
> or I could do it that way. I can't convert the integer to a string
> either because that would blow my 32 bit requirement. Does anyone have
> any idea?

Strings are just blobs of binary data, when they go through #send. The
receiver doesn't know it started life as a ruby string.

If you want structure, use #pack. You'll need to know what byte-order
the client and server should use to communicate. Assuming big-endian:

myUDPsocket.send([Time.now.to_i].pack("N"), 0, host, port)

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

khaines

9/4/2007 11:08:00 PM

0

see

9/5/2007 3:30:00 AM

0

In article <63fd7d04f963970925560990c6583e9d@ruby-forum.com>,
Ryan Parmeter <parkingmeter@gmail.com> writes:
> I am writing a small TimeP (RFC 868) server to sync time with some
> networking equipment. The equipment that shall go nameless requires the
> use of UDP.
>
> As far as I can tell, my only option to write to a UDPSocket is to use
> the send method, which takes a string. I need to send a 32bit integer
> representing the date in a UDP packet and I'd love to use something
> like:
>
> myUDPsocket.send( Time.now.to_i, 0, host, port)
>
> In my situation I can't change the receiving program to accept a string
> or I could do it that way. I can't convert the integer to a string
> either because that would blow my 32 bit requirement. Does anyone have
> any idea?
>
> ~Parkingmeter

Here, I had this script lying about from one of my earlier experiments
with Ruby sockets:

- dmw

------ start of code -------
#! /usr/bin/env ruby

# nettimesvr.rb - implement Time Server for RFC 868

PROGNAME = 'nettimesvr.rb'
timeport = Socket.getservbyname('time', 'udp') # port 37
# timeport = 50037 # for testing
RFC868_POSIX_ADJMENT = 2_208_988_800 # diff between RFC 868 and POSIX
POSIX_EPOCH_ADJMENT = Time.gm(1970, 'Jan', 1).to_i

require 'socket'

def curnettime()
return Time.new.to_i + (RFC868_POSIX_ADJMENT - POSIX_EPOCH_ADJMENT)
end

port = timeport
begin
case ARGV.size
when 1: port = Integer(ARGV[0])
when 0: nil
else; abort "Usage: #{PROGNAME} [ port ]"
end
rescue ArgumentError => badarg
abort "Argument conversion error: #{badarg}"
end

puts "Listening on port #{port}\n"

UDPSocket.open { |sock|
sock.bind(Socket::INADDR_ANY, port)
loop do
# if we try to receive zero bytes, we get an error
rmthost = sock.recvfrom(1) [1] # no body expected
puts "Accepted request from #{rmthost [2]}"

nettime = [ curnettime() ].pack('N')
sock.send(nettime, 0, rmthost[2], rmthost[1])
end
}

------ end of code -------

--
.. Douglas Wells . Connection Technologies .
.. Internet: -sp9804- -at - contek.com- .