Сокращение времени ожидания сокета с помощью Timeout :: timeout (n), похоже, не работает для меня - PullRequest
2 голосов
/ 12 августа 2010

Я нашел то, что, по моему мнению, должно отлично работать на https://stackoverflow.com/questions/517219?tab=oldest#tab-top, но у меня это не сработало.

У меня установлен Ruby 1.9.1 на Windows и, когда я пытаюсь попробовать пример "is_port_open "test, это не работает.Вызов сокета все еще занимает около 20 секунд, независимо от того, какое значение я установил для времени ожидания.Есть идеи почему?

Ответы [ 2 ]

5 голосов
/ 13 августа 2010

Следующий код работает с ruby ​​1.9.1 в Windows:

require 'socket'

def is_port_open?(ip, port)
  s = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
  sa = Socket.sockaddr_in(port, ip)

  begin
    s.connect_nonblock(sa)
  rescue Errno::EINPROGRESS
    if IO.select(nil, [s], nil, 1)
      begin
        s.connect_nonblock(sa)
      rescue Errno::EISCONN
        return true
      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
        return false
      end
    end
  end

  return false
end

Я еще не выяснил, почему оригинальный код is_port_open? () Не работает в Windows с ruby ​​1.9.1 (он работает в других ОС).

0 голосов
/ 12 августа 2010

Это может быть связано с некоторыми внутренними проблемами с библиотекой Rubys Timeout. Вы можете достичь этого, непосредственно обращаясь к базовой библиотеке сокетов и устанавливая тайм-ауты в Socket. В этой статье это подробно рассматривается, хотя предполагается, что * nix, поэтому у вас могут возникнуть проблемы с Windows, я не уверен, насколько похожи реализации сокетов.

...