2012-09-03 3 views
0

에서 "아니오 버퍼 공간을 사용할 수"오류가 나는 포트 (411)예방 루비

스크립트는 때때로 잘 작동

에 192.168.220.xxx에 192.168.190.xxx에 이르기까지 모든 IP를 스캔 작은 스크립트가 - 소켓이 제대로 닫혀 있지 때이 발생 (2) (errno를 :: ENOBUFS)`

내가 읽고 연결을 사용할 수 없음 버퍼 공간 : 그러나 때때로 나는 "사용할 수있는 버퍼 공간" dcport.rb:8:in 초기화 '오류를 얻을 ,하지만 난 그게 제대로 작동하지 않습니다 방지하기 위해 mysocket.close을 사용했습니다.

어떻게 이런 일이 일어나지 않도록 방지하려면 소켓을 올바르게 닫는 방법을 말하고 싶습니까? 내 생각은

require 'socket' 
require 'timeout' 
(190...216).each do |i| 
    (0...255).each do |j| 
    begin 
     #puts "Scanning 192.168.#{i}.#{j}" 
     scan=Timeout::timeout(10/1000.0) { 
     s=TCPSocket.new("192.168.#{i}.#{j}",411) 
     s.close 
     puts "192.168.#{i}.#{j} => Hub running" 
     } 
    rescue Timeout::Error 
    rescue Errno::ENETUNREACH 
    rescue Errno::ECONNREFUSED 
    end 
    end 
end 

답변

2

을 다음과 같이

내 코드는, 가끔, 소켓 생성 및 일부 소켓을 누설하게 소켓 닫는 사이의 시간 초과가 발생합니다. (빠른 Google 검색에서 나에게 말한대로) ENOBUFS는 기본적으로 1024 개의 소켓이 열리면 기본적으로 발생합니다.

Thread.raise와 마찬가지로 시간 초과는 사용자가 실제로 더 이상 보장 할 수 없기 때문에 (예 : s.close에서) 어떤 일이 발생해야하는 상황에서 매우 해로 우며 예외가 발생할 수 있습니다 어디서나, 심지어 보장 블록 내에서도. 귀하의 경우에는

, 나는 당신이이 외부 타임 아웃 블록을 절 을 위해 추가하여 문제를 해결할 수 있다고 생각한다 (테스트되지 않은 코드는 다음) :

require 'socket' 
require 'timeout' 
(190...216).each do |i| 
    (0...255).each do |j| 
    begin 
     #puts "Scanning 192.168.#{i}.#{j}" 
     s = nil 
     scan=Timeout::timeout(10/1000.0) do 
     s=TCPSocket.new("192.168.#{i}.#{j}",411) 
     puts "192.168.#{i}.#{j} => Hub running" 
     end 
    rescue Timeout::Error 
    rescue Errno::ENETUNREACH 
    rescue Errno::ECONNREFUSED 
    ensure 
     s.close if s 
    end 
    end 
end 
+0

내가위한 방법 's'를 '가지고 정의되지 않은 지역 변수 또는 이 순간에 s가 닫히는 것을 의미합니다. – pahnin

+0

여기에 예상대로 작동하지 않는다는 것을 의미합니다. – pahnin

+0

즉, 시간 초과 중 s = nil ** 외부 **를 추가하는 것을 잊었습니다. s의 정의는 타임 아웃 블럭과 begin .. ensure .. end 블럭에 의해 공유된다. 난 그냥 전체 코드 블록을 복사/붙여 넣기 및 잘 실행됩니다. –