Данный раздел содержит некоторые советы для разработчиков приложений WinSock 2. Следуя этим указаниям, разработчики смогут гарантировать, что программное обеспечение, которое они напишут, будет взаимодействовать с WinGate Winsock Redirection Protocol (WRP).
Избегайте во что бы то ни стало осуществлять протоколы, в которых приложение явно сообщает серверу, что его IP-адрес или порт предназначен для любой связи или передачи данных обратно приложению. Это нужно делать по следующим причинам:
В NAT-системах, приложение даже не может предположить свой настоящий IP-адрес, и даже не имеет механизма для его обнаружения.
Сервер может всегда использовать getpeername() для поиска места, откуда приложение устанавливает связь, так что передача информации бывает часто излишней (и может ввести в заблуждение).
Избегайте во что бы то ни стало использования фиксированных номеров портов в приложениях. Если приложение нуждается в соединении или получении данных о номере порта, данный номер должен быть назначен операционной системой (вызовом bind() с нулевым номером порта), и полученный номер передается на другой конец. Будьте осторожны при подобной разработке, так как она может испортить некоторые NAT-системы. Лучшим способом для этого, будет создание требуемых соединений, инициированных приложением.
Рассмотрим вариант, что компьютер может быть multi-homed. Так, вызов gethostbyname() вследствие gethostname() и использование первого возвращенного IP-адреса, испортит множество приложений. Если вам очень нужно знать свой IP-адрес, получите его, связавшись с локальным компьютером, который увидит другой хост, являющийся второй, заинтересованной в связи, стороной. Вы можете это сделать следующим образом:
Если вы имеете TCP-соединение, открытое другой стороне, вызовите getsockname() на этом сокете для извлечения вашего IP-адреса.
Еще, если у вас нет соединения, создайте фиктивное соединение с известной службой другой стороны и, затем вызовите getsockname() на подсоединенном сокете.
Или, если вы не знаете к какой службе подсоединиться, присвойте фиктивный сокет каждому известному интерфейсу, и попытайтесь соединиться с другой стороной через случайно выбранный порт. Произойдет быстрый сбой в соединении с сообщением WSAENETUNREACHABLE, если соединение было неверным. Вы получите успешное соединение, или сбой в соединении, означающий то, что соединение неверно.
Или, используя протокол SNMP для составления таблицы маршрутизации на вашем компьютере, и на ее основе определить IP-адрес.
Или использовать запрос Winsock 2 для определения правильного соединения.
Дополнительные примечания:
При использовании WRP и WinGate Internet Client, или socks client и сервера, ВСЕ пользовательские компьютеры сразу же станут multi-homed. По этой причине третье указание становится чрезвычайно важным.
Некоторые circuit-level приемы прокси вызывают getsockname() и getpeername(), и обеспечивают соединение с сервером. Некоторые нет. WRP/WGIC делают.
No comments
RSS / trackback