class LLencError < StandardError def initialize(msg) @msg = msg end def to_s() return @msg end end class LLenc def initialize socket @socket = socket @read_timeout = @write_timeout = 24 * 3600 @ip = @socket.peeraddr[3] end def set_timeout time @read_timeout = @write_timeout = time end def peeraddr return @socket.peeraddr end def write datas timeout @write_timeout do dl = datas.length t_dl = dl.to_s if dl >= 10 then # Case 2 l = [] l[0] = t_dl.length + 64 return @socket.write(l.pack('C') + t_dl + datas) else # Case 1 return @socket.write(t_dl + datas) end end end def read timeout @read_timeout do dl = 0 # Data length l = @socket.read 1 if l.nil? raise LLencError.new("1st l read error") end l = l.unpack 'C' if l[0] >= 48 and l[0] <= 57 then # Case 1 dl = l[0] - 48 else # Case 2 if l[0] >= 65 and l[0] <= 90 then l = @socket.read(l[0] - 64) if l.nil? raise LLencError.new("2nd l read error") end l = l.unpack 'C*' l.each do |val| dl = dl * 10 + val - 48 end else raise LLencError.new("invalid l") end end t = @socket.read dl if t.nil? raise LLencError.new("data read error") end return t end end end