2010-08-24 32 views
12

Tôi muốn ping một trang web trong mã ruby ​​của tôi và thấy rằng net-ping là một thư viện tốt để làm điều này với. Thật không may, khi tôi đã cố gắng để cài đặt net-ping tôi nhận được lỗi sau:ping ruby ​​cho 1.9.1

C:>gem install net-ping
ERROR: Error installing net-ping:
win32-open3 requires Ruby version < 1.9.0.

khi nghiên cứu sâu hơn, tôi thấy rằng không có sẵn net-net cho 1,9.X. Có ai có một đoạn mã tốt mà họ sẽ sẵn sàng chia sẻ hay không.

+0

Nếu bạn thực sự cần phải thực hiện ping ICMP, bạn luôn có thể sử dụng công cụ hệ điều hành gốc như '' ping -c 1 host'' và kết quả phân tích cú pháp. – taro

Trả lời

12

Bạn luôn có thể làm điều này và sử dụng regexps để phân tích kết quả hoặc chỉ cần kiểm tra trạng thái thoát:

ping_count = 10 
server = "www.google.com" 
result = `ping -q -C#{ping_count} #{server}` 
if ($?.exitstatus == 0) do 
    puts "Device is up!" 
end 

giá trị trả về Ping mà bạn có thể kiểm tra chống lại:

The ping utility returns an exit status of zero if at least one response was heard from the specified host; a status of two if the transmission was successful but no responses were received; or another value (from <sysexits.h>) if an error occurred.

http://www.manpagez.com/man/8/ping

+0

Chỉ cần kiểm tra xem thiết bị có hoạt động không trước khi tôi chạy phần còn lại của mã. Ngoài ra, đã thử mã của bạn, làm cách nào để xem kết quả của ping? – rahrahruby

+0

Xem câu trả lời đã chỉnh sửa. – Mahmoud

+2

Đây là gợi ý tôi cần để sử dụng '\' ping -t 1 ipinfodb.com \ '' để có thời gian chờ làm việc và tìm hiểu xem ipinfodb.com có ​​trực tuyến hay không. Timeout và SystemTimer cả hai đều không hoạt động bằng cách nào đó và chờ đợi đầy đủ 60 giây để ném một lỗi. Cảm ơn! –

14

Nếu bằng 'trang web', bạn có nghĩa là trang web, sau đó tôi sẽ không sử dụng ping. Ping sẽ cho bạn biết liệu máy chủ có hoạt động không (trừ khi bộ định tuyến hoặc tường lửa chặn ICMP), nhưng nó sẽ không cho bạn biết liệu máy chủ web hoặc ứng dụng web của bạn có phản hồi đúng hay không.

Nếu đúng như vậy, tôi khuyên bạn nên sử dụng Net :: HTTP từ thư viện chuẩn hoặc bất kỳ thư viện HTTP nào khác. Một cách để làm điều đó là:

def up?(site) 
    Net::HTTP.new(site).head('/').kind_of? Net::HTTPOK 
end 

up? 'www.google.com' #=> true 
+1

Ngoài ra trang web có thể từ chối các yêu cầu không phải trình duyệt. So sánh www.habrahabr.ru và www.google.ru. Vì vậy, bạn cần nhìn vào phản ứng chặt chẽ hơn và/hoặc chơi với các tác nhân người dùng. – Nakilon

+0

Tôi gặp sự cố với mã này trên cửa sổ, nhận được "Cổng Xấu" cho một trang web đang hoạt động. Tôi có thể làm việc xung quanh nó bằng cách sử dụng "get" thay vì "head". Có lẽ điều này giúp ai đó trên cửa sổ. – mit

+0

@mit Âm thanh như bạn nhấn vào một proxy không phải là thông số kỹ thuật và không thể xử lý các yêu cầu 'HEAD'. Vui vì bạn đã làm việc với 'get'. –

1

Sử dụng từ source

gem "net-ping", :git => 'git://github.com/djberg96/net-ping.git' 
# bundle install 

Bây giờ bạn có thể sử dụng chức năng từ nó trong 1.9.2

2

Đối với cửa sổ làm theo hướng dẫn sau:

download djberg96-net-ping-net-ping-1.5.3-0-g9252076.zip from github.com/djberg96/net-ping 
unzip, cd in the folder 
gem build net-ping.gemspec 
gem install net-ping-1.5.3-universal-mingw32.gem 
gem install win32-security 

để sử dụng:

require 'net/ping' 
p Net::Ping::TCP.new('www.google.com', 'http').ping? 
p Net::Ping::TCP.new('foo.bar.baz').ping? 
Các vấn đề liên quan