Haskell SOCKS5拒绝连接

时间:2013-01-05 13:18:32

标签: haskell proxy connection socks tor

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

为了给你布局,我在localhost @ 9050上运行它肯定有效,因为我可以配置我的浏览器通过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数据包发布到localhost。谢谢。

1 个答案:

答案 0 :(得分:7)

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

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

请注意,实际上你已经使用PortNumber 80执行了此操作,因为构造函数PortNumber实际上采用类型为PortNumber的参数,而不是Word16(它生成一个PortID;遗憾的是,类型和构造函数允许具有相同的名称,即使它们是不相关的。)

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

甚至可能犯这个错误的事实(据我所知)只是网络包的API设计不佳的工件。虽然最近这种情况有所改善,但是如果不对网络软件包进行API更改,就很难对其中的一些客户端造成不利影响。