【问题标题】:Haskell SOCKS5 Refusing to ConnectHaskell SOCKS5 拒绝连接
【发布时间】:2013-01-05 13:18:31
【问题描述】:

我已经解决这个问题好几个星期了,但似乎无法理解... 我一直在尝试编写一个连接到 socks5 代理(即 tor)的 Haskell 程序,这样我就可以从程序中访问洋葱站点,但它不起作用。

为了给你布局,我在 localhost@9050 上运行了 tor,它确实有效,因为我可以配置我的浏览器以通过 socks5 使用它。 Privoxy 没有运行。

源码为:

import Network
import Network.Socket
import Network.Socks5

    getonion :: IO ()
    getonion = do
            putStrLn "Connecting..."
            sock <- socksConnectWith (defaultSocksConf "localhost" (PortNum 9050)) "exampleonion.onion" (PortNumber 80)
            putStrLn "Connected!"

每次我运行 getonion 时,总是会导致:

Connecting...
*** Exception: connect: does not exist (Connection refused)

我尝试过使用各种方式连接到 localhost,即引用的其他函数 herehere,但 socksConnectWith 似乎是最直接的。

如果有人能帮我解决这个问题,将不胜感激。我什至可以将来自我的程序的wireshark 数据包发布到本地主机。谢谢。

【问题讨论】:

    标签: haskell proxy connection socks tor


    【解决方案1】:

    不用PortNum构造函数,直接在源文件中写入端口号即可:

    sock <- socksConnectWith (defaultSocksConf "localhost" 9050) "exampleonion.onion" (PortNumber 80)
    

    请注意实际上您已经在使用 PortNumber 80 执行此操作,因为构造函数 PortNumber 实际上采用 PortNumber 类型的参数,而不是 Word16(它产生 PortID;不幸的是,类型和允许构造函数具有相同的名称,即使它们在其他方面不相关)。

    在 Haskell 中,像上面这样的整数文字是(比如)fromInteger 80 的缩写,fromInteger 函数(来自 Num 类型类,其中 PortNumber 是一个实例)将给定的整数转换为您的网络字节顺序 - 直接构造函数应用程序不会。

    甚至可能犯这个错误的事实(据我所知)只是网络包的 API 设计不佳的产物。尽管最近这种情况有所改善,但要对网络包进行 API 更改而不扰乱其众多客户端中的一些是相当困难的。

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多