Skip to content

Instantly share code, notes, and snippets.

@ZumiKua
Created September 7, 2015 04:02
Show Gist options
  • Save ZumiKua/de067468f7969fc589b7 to your computer and use it in GitHub Desktop.
Save ZumiKua/de067468f7969fc589b7 to your computer and use it in GitHub Desktop.
minimal lan messager over udp
require 'socket'
PORT = 12321
def process_message(message,packet_info)
message = Marshal.load(message)
case message[:type]
when :broadcast
return reply_broadcast(message,packet_info)
when :reply
return deal_reply(message,packet_info)
when :message
return display(message,packet_info)
end
end
def reply_broadcast(message,packet_info)
$ip_table[message[:message]] = packet_info[2]
reply_msg = Marshal.dump({type: :reply,message: $name})
UDPSocket.new.tap{|s| s.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)}.send(reply_msg,0,'255.255.255.255',PORT)
end
def display(message,packet_info)
puts "#{$ip_table.key(packet_info[2])}:#{message[:message]}"
end
def deal_reply(message,packet_info)
$ip_table[message[:message]] = packet_info[2]
end
def init
$name = 'unnamed'
loop do
puts 'your name?'
$name = gets.strip
message = Marshal.dump({type: :broadcast,message: $name})
if message.length > 65535
puts 'name is too long'
next
end
UDPSocket.new.tap{|s| s.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)}.send(message,0,'255.255.255.255',PORT)
break
end
end
$ip_table = {'broadcast'=>'255.255.255.255'}
socket = UDPSocket.new
Thread.new {
socket = UDPSocket.new
socket.bind('0.0.0.0',PORT)
loop do
begin
message = socket.recvfrom_nonblock(65535)
process_message(*message)
rescue Errno::EWOULDBLOCK#,Errno::AGAIN
select([socket])
end
end
}
init
loop do
s = gets.strip
s =~ /(.+?)\:(.+)/
to = $1
msg = $2
if to.nil? or msg.nil?
puts 'syntax error'
next
elsif $ip_table[to].nil?
puts 'unknown user'
next
else
message = Marshal.dump({type: :message,message: msg})
if message.length > 65535
puts 'message is too long'
next
end
end
UDPSocket.new.tap{|s| s.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)}.send(message,0,$ip_table[to],PORT)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment