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