gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:04:28 25 4
gpt4 key购买 nike

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

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块。如何检测断开的套接字并使服务器线程正确退出?

最佳答案

当连接关闭时,sock.gets返回nil,即。

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

应该管用。

出于调试目的
require 'socket'
Thread.abort_on_exception=true

可用于。然后,原始代码将由于以下原因而结束

undefined method `chomp' for nil:NilClass (NoMethodError)



有关更多详细信息,请参见 this answer

关于ruby - 如何在Ruby中检测断开的Unix域套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com