3

私はそれを閉じようとしているときを除いてうまく機能するRubyTCPSocketクライアントを持っています。以下のコードでdisconnectメソッドを呼び出すと、次のエラーが発生します。

./smartlinc.rb:70:in `start_listen': stream closed (IOError)
    from ./smartlinc.rb:132:in `initialize'
    from ./smartlinc.rb:132:in `new'
    from ./smartlinc.rb:132:in `start_listen'
    from bot.rb:45:in `initialize'
    from bot.rb:223:in `new'
    from bot.rb:223

(簡略化された)コードは次のとおりです。

class Smartlinc

    def initialize
        @socket = TCPSocket.new(HOST, PORT)
    end

    def disconnect
        @socket.close
    end

    def start_listen
        # Listen on a background thread
        th = Thread.new do
            Thread.current.abort_on_exception = true

            # Listen for Ctrl-C and disconnect socket gracefully.
            Kernel.trap('INT') do 
                self.disconnect
                exit
            end

            while true
                ready = IO.select([@socket])
                readable = ready[0]
                readable.each do |soc|
                    if soc == @socket
                        buf = @socket.recv_nonblock(1024)
                        if buf.length == 0
                            puts "The socket connection is dead. Exiting."
                            exit
                        else
                            puts "Received Message"
                        end
                    end
                end # end each
            end # end while

        end # end thread
    end # end message callback

end

このエラーを防止またはキャッチする方法はありますか?私はソケットプログラミングの専門家ではないので(明らかに!)、すべての助けに感謝します。

4

1 に答える 1

2

あなたのスレッドはIO.select()、トラップコードが喜んで でドアをバタンと閉めている間、座ってい@socket.closeます。

abort_on_exception を true に設定しないでください。または、コードで例外を適切に処理しないでください:
これらの行に沿った何か...

Kernel.trap('INT') do
  @interrupted = true
  disconnect
  exit
end

...
ready = nil
begin
  ready = IO.select(...)
rescue IOError
  if @interrupted
    puts "Interrupted, we're outta here..."
    exit
  end
  # Else it was a genuine IOError caused by something else, so propagate it up..
  raise
end

...
于 2011-07-02T01:17:48.640 に答える