在Haskell中编写tsocks克隆是多么合理/可能/困难

时间:2011-02-05 19:49:54

标签: haskell functional-programming network-programming system

我是一个相当称职的程序员,他知道haskell,但是没有在任何重大项目中使用它。我对c和系统以及网络编程了解得足够多,我相信我可以从源代码中挑选tsocks

我对haskell提供的低级系统接口没有任何经验。我正在寻找人们可以就此主题提供给我的任何建议,包括“不要这样做;你会讨厌自己”,只要有解释。

3 个答案:

答案 0 :(得分:4)

除了作为实验,我真的不会这样做。我是一个Haskell家伙,但不是一个深层系统的人,所以那里有一个警告。但是,我在tsocks页面上看到以下内容:

  

tsocks基于'共享库   拦截者的概念。通过使用   LD_PRELOAD环境变量或   /etc/ld.so.preload文件tsocks是   自动加载到流程中   每个执行程序的空间。从   在那里它凌驾于正常状态   connect()函数通过提供它   拥有。因此当应用程序调用时   connect()建立TCP   连接它改为通过控制   去tsocks。 tsocks决定了   连接需要通过a   SOCKS服务器(通过检查   /etc/tsocks.conf)并协商   如果是这样的连接(通过使用   真正的connect()函数)

可以从C调用Haskell,反之亦然。事实上,它相对容易。对于共享库,请参阅:http://www.haskell.org/ghc/docs/6.12.1/html/users_guide/using-shared-libs.html

但是当你从C调用Haskell时,你需要A)在运行时链接,B)调用运行时。

这样当C知道它调用Haskell时就可以了。但是当C 不知道它正在调用Haskell时它相对棘手,所以你需要用一个C库来包装Haskell共享库,该库可以透明地调用和管理运行时的程序正在预加载haskell-tsocks库以拦截其正常的连接函数。

所以我确信这可以做到 - 但这听起来相当痛苦和复杂,并且在为这一个功能必须链接整个ghc运行时方面有些昂贵。坦率地说,我想你要编写的代码(我还没有检查过tsocks代码本身),无论如何都会主要是FFI调用。

因此,袜子的某些元素的Haskell实现 - 代理,客户端等听起来很有趣并且可能有用。但是,tsocks确实的预加载魔法听起来可能不太合适。

请记住,有些Haskell黑客在这方面比我更好,知识更丰富,经验更丰富。所以他们可能会另有说法。

答案 1 :(得分:1)

(作为单独答案发布,因为这是与FFI无关的建议)

你可能知道这些东西,但万一它对任何人都有用......

答案 2 :(得分:0)

这可能不是您正在寻找的答案,但不是在Haskell中重写它,您可以使用Foreign Function Interface将已存在的C实现包装在Haskell类型中。

请注意,Haskell 2010中为数不多的主要变化之一是正式将FFI作为语言功能。链接:Haskell 2010 FFI