Насколько разумно / возможно / сложно написать клон tsocks в Haskell? - PullRequest
2 голосов
/ 05 февраля 2011

Я достаточно компетентный программист, который знает haskell, но не использовал его ни в каких крупных проектах.Я достаточно разбираюсь в c и системах и сетевом программировании, что, я думаю, я могу выделить tsocks из исходного кода.

У меня нет опыта работы с низкоуровневыми системными интерфейсами haskellобеспечивает.Я ищу любые советы, которые люди могут дать мне по этой теме, включая: «Не делай этого; ты возненавидишь себя за это», при условии, что есть объяснение.

Ответы [ 3 ]

4 голосов
/ 06 февраля 2011

Я бы на самом деле не делал этого, кроме как в качестве эксперимента. Я парень из Хаскелла, но не специалист по глубоким системам, так что здесь есть один нюанс. Но тем не менее, я вижу следующее на странице 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, которые намного лучше в этом, чем я, более знающие и более опытные. Поэтому они могут сказать иначе.

1 голос
/ 06 февраля 2011

(Публикация в качестве отдельного ответа, поскольку этот совет не связан с FFI)

Вы, вероятно, знаете этот материал, но в случае, если он пригодится кому-либо ...

0 голосов
/ 06 февраля 2011

Возможно, это не совсем тот ответ, который вы искали, но вместо того, чтобы переписать его в Haskell, вы можете просто использовать Интерфейс внешних функций , чтобы обернуть уже существующую реализацию C в типы Haskell.

Обратите внимание, что одним из немногих важных изменений в Haskell 2010 было официальное включение FFI в качестве языковой функции.Ссылка: Haskell 2010 FFI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...