如何检测Ruby中断开的Unix域套接字?

时间:2016-02-13 06:59:59

标签: ruby sockets

我在Ruby中使用Unix Domain Socket编写简单的echo服务器/客户端。这是我的代码:

server.rb

require 'socket'

# Listens server.sock and enters an infinite loop
Socket.unix_server_loop('server.sock') do |sock, addr|
  # When accepted a connection, creates a new thread
  puts "Accepted connection from:"
  Thread.new do
    loop do
      rs = IO.select([sock], [], [sock])
      p rs
      input = sock.gets.chomp
      puts "input = [#{input}]"
      sock.puts("response to #{input}")
    end
    puts "Thread quits."
    sock.close
  end
end

puts "Server quits."

client.rb

require 'socket'

UNIXSocket.open('server.sock') do |sock|
  5.times do |i|
    begin
      sock.puts "#{Time.now}: Hello #{i} from #{Process.pid}"
      puts "Recived " + sock.gets
      sleep 1
    rescue Errno::EPIPE => e
      puts "Connection closed."
      break
    end
  end
  sock.close
end

puts "Client quits."

它们正常工作,除了服务器没有检测到客户端退出并且它永远等待输入。虽然select返回文件描述符(这意味着描述符已经准备好阅读,但据我理解),sock.gets阻塞。如何检测断开的套接字并使服务器线程正常退出?

1 个答案:

答案 0 :(得分:0)

当连接关闭时,class返回nil,即

sock.gets

应该有用。

出于调试目的

input = sock.gets
break if input.nil?
input = input.chomp

可以使用。然后原始代码将因

而结束
  

未定义的方法`chomp'代表nil:NilClass(NoMethodError)

有关详细信息,请参阅this answer