overte-JulianGro/socket.rb
2013-01-11 10:43:54 -07:00

66 lines
1.6 KiB
Ruby

require 'socket'
BUFFER_SLEEP_DURATION_MSECS = 20
CLIENT_LIST_MEMORY_DURATION_SECS = 1
begin
# create the UDPSocket object
socket = UDPSocket.new
$dataBuffer = nil
$receivers = Hash.new
listenThread = Thread.new(socket) {
# bind it to 0.0.0.0 at the given port
port = 55443
socket.bind "0.0.0.0", port
puts "UDP Socket bound to port #{port} and listening."
# while true loop to keep listening for new packets
while true do
data, sender = socket.recvfrom 1024
puts "Recieved #{data.size} bytes from #{sender[3]} on #{sender[1]}"
# there are 2 bytes per sample
newSamples = data.unpack("s<*")
if $dataBuffer.nil?
$dataBuffer = newSamples
else
$dataBuffer.each_with_index do |sample, index|
sample = (sample + newSamples[index]) / 2
end
end
$receivers["#{sender[3]}:#{sender[1]}"] = Time.now.to_f
end
}
sendThread = Thread.new(socket) {
while true do
sleep(BUFFER_SLEEP_DURATION_MSECS/1000)
unless $dataBuffer.nil?
$receivers.each do |ip_port, time|
if (time > Time.now.to_f - CLIENT_LIST_MEMORY_DURATION_SECS)
ip, port = ip_port.split(':')
socket.send $dataBuffer.pack("s<*"), 0, ip, port
puts "Sent mixed frame to #{ip} on #{port}"
else
puts "Nobody to send mixed frame to"
$receivers.delete(ip_port)
end
end
$dataBuffer = nil
end
end
}
listenThread.join
sendThread.join
rescue SystemExit, Interrupt => e
puts
puts "Okay, fine. I'll stop listening."
socket.close
end