我是一个相当称职的程序员,他知道haskell,但是没有在任何重大项目中使用它。我对c和系统以及网络编程了解得足够多,我相信我可以从源代码中挑选tsocks。
我对haskell提供的低级系统接口没有任何经验。我正在寻找人们可以就此主题提供给我的任何建议,包括“不要这样做;你会讨厌自己”,只要有解释。
答案 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