2

我在 linux 机器上运行 ruby​​ 1.9.3。我想使用 SOCKSSocket,但是,我继续遇到以下错误:

未初始化的常量 SOCKSSocket

使用 IRB 的简单测试

irb(main):001:0> require 'resolv-replace'
=> true
irb(main):002:0> SOCKSSocket
NameError: uninitialized constant SOCKSSocket
    from (irb):2
    from /usr/local/bin/irb:12:in `<main>'

这是直接来自 resolv-replace.rb 的源代码

class SOCKSSocket < TCPSocket
  # :stopdoc:
  alias original_resolv_initialize initialize
  # :startdoc:
  def initialize(host, serv)
    original_resolv_initialize(IPSocket.getaddress(host), port)
  end
end if defined? SOCKSSocket

我不禁认为我需要安装一些启用袜子或其他东西所需的依赖项。任何事情都会有所帮助。

4

2 回答 2

1

好的,配置脚本似乎没有 --enable-socks 作为其有效选项列表的一部分,这就是 WARNING: unrecognized options ...

我没有追踪如何将 --enable-socks 添加到有效选项列表中,但是,我确实安装了脚本。

编辑:配置

找到部分:初始化一些变量...并添加 enable_option_checking=no

# Initialize some variables set by options.
enable_option_checking=no

现在,运行:

./configure --prefix=/usr/local --enable-socks
make
sudo make install

>ruby --version => 1.9.3p125 (2012-02-16 revision 34643) [x86_64-linux]

然后,在 irb 中尝试一下

irb(main):001:0> require 'socket'
=> true
irb(main):002:0> require 'resolv-replace'
=> true
irb(main):003:0> SOCKSSocket
=> SOCKSSocket
irb(main):004:0>

我还没有使用 SOCKSSocket 做任何事情,但是,至少现在看起来我的代码可以访问它。另外,我假设有一些 ENV var 可以禁用选项检查或更好的解决方法。我只是没有追查到。

谢谢你的帮助!!

于 2012-03-30T02:32:38.723 回答
0

SOCKSSocket 似乎是 ruby​​ 的一个可选组件。这就是为什么 resolv-replace 只对已经存在的类进行猴子补丁。

作为说明,“net/ftp”定义了以下方法:

def open_socket(host, port)
  if defined? SOCKSSocket and ENV["SOCKS_SERVER"]
    @passive = true
    return SOCKSSocket.open(host, port)
  else
    return TCPSocket.open(host, port)
  end
end

也许您可以做类似的事情(即,如果您启用了 SOCKS,则创建一个 SOCKS 套接字,否则创建一个无聊的旧 TCP 套接字)。

如果你真的需要代理行为,快速谷歌搜索会发现以下 gem:http ://socksify.rubyforge.org/这可能很有用。

于 2012-03-30T00:41:22.997 回答