Я бы на самом деле не делал этого, кроме как в качестве эксперимента. Я парень из Хаскелла, но не специалист по глубоким системам, так что здесь есть один нюанс. Но тем не менее, я вижу следующее на странице tsocks:
tsocks основан на 'общей библиотеке
Концепция перехватчика. Благодаря использованию
переменная среды LD_PRELOAD или
файл /etc/ld.so.preload tsocks
автоматически загружается в процесс
пространство каждой исполняемой программы. От
там он перекрывает нормальный
функция connect (), предоставляя
своя. Таким образом, когда приложение вызывает
connect () чтобы установить TCP
соединение вместо этого проходит контроль
цокам. Tsocks определяет, если
соединение должно быть сделано через
Сервер SOCKS (путем проверки
/etc/tsocks.conf) и согласовывает
соединение, если так (с помощью
функция реального соединения ()
Можно звонить на Хаскелл из Си, и наоборот. И это относительно легко, на самом деле. Для общих библиотек смотрите это: http://www.haskell.org/ghc/docs/6.12.1/html/users_guide/using-shared-libs.html.
Но когда вы вызываете Haskell из C, вам нужно A) связать во время выполнения и B) вызвать время выполнения.
Так что это работает, когда C знает, что он вызывает Haskell. Но это относительно хитрее, когда C не знает , что он вызывает Haskell, и поэтому вам нужно обернуть общую библиотеку Haskell библиотекой C, которая вызывала и управляла средой выполнения прозрачно для программы, предварительная загрузка библиотеки haskell-tsocks для перехвата ее обычных функций соединения.
Так что я уверен, что это можно сделать - но это звучит довольно болезненно и сложно, и несколько дорого с точки зрения необходимости связать всю среду выполнения ghc с этой единственной функцией. И, честно говоря, я представляю, что код, который вы будете писать (я еще не проверял сам код tsocks), во многом будет FFI-вызовами.
Так что реализация на Haskell какого-то элемента socks - прокси, клиента и т. Д. Звучит интересно и потенциально полезно. Но точная магия предзагрузки, которую совершает Цокс, звучит как, возможно, плохая посадка.
Имейте в виду, что есть хакеры на Haskell, которые намного лучше в этом, чем я, более знающие и более опытные. Поэтому они могут сказать иначе.