Subversion Repositories Projects

Rev

Blame | Last modification | View Log | RSS feed

# mailto: ligi atttt ligi dotttt de
require 'socket'
require 'fcntl'

class IPSocket
  def portInfo(out = STDOUT)
    out.puts "local:  #{addr[1]}\n" +
      "remote: #{peeraddr[1]}"
  end
end



if ARGV.length!=1 || !ARGV[0].include?(":")
  puts "USAGE:"
  puts "$> ruby messenger.rb [ip:port]"
  puts ""
  puts "using default address"
  host="0"
  port=9876
else
  host=ARGV[0].split(":").first
  port=ARGV[0].split(":").last.to_i  
end



puts "starting server at ip " + host + " port:" + port.to_s
serverSocket = TCPServer.new(host,port)

slots={ }
server = Thread.start {
  while (clientSocket = serverSocket.accept)
    Thread.start {
      clientSocket_= clientSocket
      clientSocket_.portInfo


      while true

      begin

        command=clientSocket_.gets
        puts command
        case
        when command =~ /new/
          clientSocket_.puts "new"
          if slots[command.delete("\r\n").split(":").last].nil?
            slots[command.delete("\r\n").split(":").last]={:from=>clientSocket_ , :to=>nil}
            break
          else
             clientSocket_.puts "slot exists"
          end
        when command =~ /conn/

          case
          when slots[command.delete("\r\n").split(":").last].nil?
            clientSocket_.puts "slot not found"
          when !slots[command.delete("\r\n").split(":").last][:to].nil?
            clientSocket_.puts "slot has partner"
          else
            clientSocket_.puts "conn"
            slots[command.delete("\r\n").split(":").last][:to]=clientSocket_

            break
          end

        when command =~ /all/
#          clientSocket_.puts slots.keys
          if slots=={}
              clientSocket_.puts "none"
          else
          slots.keys.each_with_index {|slot,i|
              clientSocket_.puts i.to_s + " | " + slot + ((slots[slot][:to].nil?)?"| free":"| connected")
            }
          end

         
        else
          clientSocket_.puts "Unknown command"

      end

        rescue =>e
        puts "err" + e
      end
      end
    }
end
}

while true
slots.each { |slot_name,hash|

#puts " processing " + slot_name


if !hash[:to].nil?
begin

got=hash[:to].read_nonblock(3000)
puts slot_name +"<"+ got
hash[:from].write got
hash[:to].flush

rescue  Errno::EAGAIN => e
rescue =>e
 slots[slot_name][:to]=nil
  p e

end
end

begin

got=hash[:from].read_nonblock(3000)
puts slot_name +">"+ got
hash[:to].write got if !hash[:to].nil?
hash[:to].flush  if !hash[:to].nil?

rescue  Errno::EAGAIN => e
rescue =>e
hash[:to].close if !hash[:to].nil?
 slots.delete(slot_name)
  p e

end

#
}
sleep 0.00005



end