Created
September 7, 2015 04:02
-
-
Save ZumiKua/de067468f7969fc589b7 to your computer and use it in GitHub Desktop.
minimal lan messager over udp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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