2012-09-03 37 views
0

“没有缓冲区空间可用”的错误我有一个小脚本,扫描所有的IPS从192.168.190.xxx到192.168.220.xxx端口411防止红宝石

该脚本正常工作,有时,但有时我得到的错误“没有可用的缓冲空间” dcport.rb:8:in初始化':没有可用的缓冲空间 - 连接(2)(错误:: ENOBUFS)`

我已阅读,当插座都无法正常关闭,这种情况发生,但我已使用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

我的猜测是,有时候,socket建立和插座关闭,它让你漏了一些插座之间的超时火灾。因为(就一个快速谷歌搜索告诉我),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”为main:Object(NameError)'这意味着s在这个瞬间被关闭了.. – pahnin

+0

我的意思是如果在这里没有按照预期的那样工作 – pahnin

+0

这意味着你忘记在超时的**之外添加s = nil **, s的定义由超时块和begin .. ensure .. end块共享。我只是复制/粘贴整个代码块,它运行良好。 –