2

我已经研究这个问题好几个星期了,但似乎无法得到它......我一直在尝试编写一个连接到 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,即此处此处引用的其他函数,但 socksConnectWith 似乎是最直接的。

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

4

1 回答 1

7

而不是使用PortNum构造函数,只需在源文件中写入端口号:

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

请注意实际上您是如何使用 执行此操作的PortNumber 80,因为构造函数PortNumber实际上接受了 type 的参数PortNumber,而不是Word16(它产生 a PortID;不幸的是,即使类型和构造函数不相关,也允许它们具有相同的名称)。

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

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

于 2013-01-05T16:16:59.053 回答