Class: Ucp::Util::UcpServer

Inherits:
Object
  • Object
show all
Defined in:
lib/ucp/util/ucp_server.rb

Instance Method Summary collapse

Constructor Details

#initialize(handler, port, host = nil) ⇒ UcpServer

Returns a new instance of UcpServer.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/ucp/util/ucp_server.rb', line 30

def initialize(handler,port,host=nil)

#     serv = TCPServer.new(port)
#     begin
#       @sock = serv.accept_nonblock
#     rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR
#       IO.select([serv])
#       retry
#     end
#     # sock is an accepted socket.
  
#  end


  @server = host ? TCPServer.open(host, port) : TCPServer.open(port)
  @server.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )


  port = @server.addr[1]
  addrs = @server.addr[2..-1].uniq

  puts "*** listening on #{addrs.collect{|a|"#{a}:#{port}"}.join(' ')}"

  Thread.start do

    loop do
      socket = @server.accept

      Thread.start do # one thread per client
        s = socket

        port = s.peeraddr[1]
        name = s.peeraddr[2]
        addr = s.peeraddr[3]

        #puts "*** recieving from #{name}:#{port}"

        begin
          while line = s.gets(3.chr) # read a line at a time

            #puts "#{addr} [#{Time.now}]: #{line}"

            puts "Srecv: #{line}\n"              
            ucp=UCP.parse_str(line)

            if ucp.operation.eql?("01") || ucp.operation.eql?("30") || ucp.operation.eql?("51") || ucp.operation.eql?("52")
              text=UCP.decode_ucp_msg(ucp)
              #puts "texto_recebido: #{text}\n"
              ="unknown"
              smsreq=SmsRequest.new(UCP.decode_ucp_oadc(ucp),ucp.get_field(:adc),text,,addr,port)
              smsreq.set_parts_info(ucp.message_ref, ucp.part_nr, ucp.total_parts)
              handler.call(smsreq)
            elsif ucp.operation.eql?("60")
              if !@auth_handler.nil?
                authreq=AuthRequest.new(ucp.get_field(:oadc),UCP.decode_ira(ucp.get_field(:pwd)),addr,port)
                auth_result=@auth_handler.call(authreq)
                if !auth_result
                  reply_ucp=UCP.make_ucp_result(ucp)
                  reply_ucp.nack("01","authentication failed")
                  #puts "reply #{reply_ucp.to_s}"
                  s.print reply_ucp.to_s
                  puts "Ssent: #{reply_ucp.to_s}\n"
                  puts "*** #{name}:#{port} forced disconnected"
                  s.close # close socket
                  break
                else
                  =authreq.
                end
              end
            end

            reply_ucp=UCP.make_ucp_result(ucp)
            if reply_ucp.operation == "31" || reply_ucp.operation == "60"
              reply_ucp.ack("ok")
            else
              smscid="#{ucp.get_field(:adc)}:#{Time.now.strftime("%d%m%y%H%M%S")}"
              reply_ucp.ack("",smscid)
            end

            #puts "reply #{reply_ucp.to_s}"
            s.print reply_ucp.to_s
            puts "Ssent: #{reply_ucp.to_s}\n"
          end
        rescue Exception=>e
          puts "Error: #{e.backtrace}"
        ensure
          puts "*** #{name}:#{port} disconnected/closed"
          s.close # close socket on error
        end

        # end Thread
      end

      # end loop
    end

    # end Thread accept
  end


  # end initialize
end

Instance Method Details

#set_authentication_handler(handler) ⇒ Object



137
138
139
# File 'lib/ucp/util/ucp_server.rb', line 137

def set_authentication_handler(handler)
  @auth_handler=handler
end

#stopObject



133
134
135
# File 'lib/ucp/util/ucp_server.rb', line 133

def stop
  @server.close
end