Описание особенностей библиотеки проксирования libsocks
SOCKS - это пакет, состоящий из прокси-сервера, клиентских программ и библиотеки (libsocks) для адаптации ваших приложений в клиентские прокси-программы.
Изначально, SOCKS был написан David Koblas. Протокол SOCKS с тех пор претерпел изменения. Клиентская библиотека, поставляемая с момента печати, соответствует SOCKS v4.2. Поскольку сервер и клиенты должны использовать один и тот же протокол SOCKS, эта библиотека не работает с серверами предыдущих версий; клиенты, скомпилированные с этими библиотеками, не будут работать со старыми серверами.
Если ваш клиент использует UDP для передачи данных, вы не сможете использовать SOCKS. Чтобы узнать, использует ли ваш клиент UDP, найдите упоминание «SOCK_DGRAM» в исходном коде. |
-Dconnect=Rconnect -Dgetsockname=Rgetsockname \ -Dbind=Rbind -Daccept=Raccept -Dlisten=Rlisten \ -Drcmd=Rrcmd -Dselect=Rselect
При использовании Makefile, добавьте данные флаги к определению макроса CFLAGS
.
Эти флаги заменяют вызовы определенных функций аналогами, использующими сервер SOCKS:
Не SOCKS функция: | SOCKS функция: |
---|---|
accept() | Raccept() |
bind() | Rbind() |
connect() | Rconnect() |
getsockname() | Rgetsockname() |
listen() | Rlisten() |
rcmd() | Rrcmd() |
select() | Rselect() |
При использовании Makefile, добавьте данный флаг к определению макроса LDFLAGS
.
Для большинства программ описанных выше шагов должно быть достаточно для применения пакета. Если вышеперечисленное не сработало, возможно, потребуется более детальное рассмотрение вопроса. В следующем разделе описывается, как предполагается использовать библиотеку SOCKS.
Библиотека SOCKS охватывает только некоторые функции сокетов, которые должны вызываться в определенном порядке:
-1
и установкой errno в EISCONN
. Это требуется даже в том случае, если вызвать select() на запись, чтобы проверить готовность данного сокета.
Пока соединение еще не установлено, не пытайтесь запустить другое соединение через connect(), или начать новую последовательность через bind(), getsockname(), listen() и accept(). |
Большинство клиентских программ очень хорошо соответствуют этим предположениям и могут быть приведены к SOCKS без изменения кода, используя шаги, описанные в Как настроить клиент для использования SOCKS.
Некоторые клиентские программы вызывают bind() перед каждым connect(). Если bind() используется для запроса определенного порта или определенного сетевого интерфейса, то текущая реализация библиотеки SOCKS не может обеспечить данное использование. Хотя довольно часто, такой вызов bind() присутствует без единой на то причины и может быть удален без последствий.
Предыдущий раздел: Описание API библиотеки asyncmsg