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