Я думаю, что неблокирующий подход - это путь.
Я попробовал упомянутую выше статью и все еще мог заставить ее зависать.
эта статья неблокирующая сеть и описанный выше подход jonke привели меня на правильный путь Мой сервер блокировал исходное соединение, поэтому мне нужно было, чтобы он был немного ниже.
гнездо rdoc может дать более подробную информацию в connect_nonblock
def self.open(host, port, timeout=10)
addr = Socket.getaddrinfo(host, nil)
sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
begin
sock.connect_nonblock(Socket.pack_sockaddr_in(port, addr[0][3]))
rescue Errno::EINPROGRESS
resp = IO.select([sock],nil, nil, timeout.to_i)
if resp.nil?
raise Errno::ECONNREFUSED
end
begin
sock.connect_nonblock(Socket.pack_sockaddr_in(port, addr[0][3]))
rescue Errno::EISCONN
end
end
sock
end
чтобы получить хороший тест. запустите простой сервер сокетов, а затем выполните ctrl-z, чтобы создать фон
IO.select ожидает поступления данных во входной поток в течение 10 секунд. это может не сработать, если это не так.
Это должно быть хорошей заменой открытого метода TCPSocket.