Context
Я сделал реализацию SOCKS 5 Proxy в C # на основе спецификации RFC 1928 как часть программного обеспечения, над которым я работаю. Прокси-сервер будет запускаться локально внутри моего программного обеспечения (то есть он не находится на удаленном сервере) и будет использоваться для перенаправления определенных HTTP
/ HTTPS
подключений на определенный IP-адрес.
Как это должно работать / причина локального прокси
Мое программное обеспечение является своего рода средством запуска, которое запускает файл .jar
. Java-программа принимает необязательные параметры, которые указывают прокси-сервер, и я хочу использовать эту функцию для перенаправления любых HTTP
или HTTPS
запросов, сделанных java-программой, на мои собственные серверы. Вот почему прокси-сервер ДОЛЖЕН работать на том же компьютере, что и прокси-клиент (Java-программа).
Моя проблема
Я тестирую этот прокси с помощью простой Java-программы, которая пытается получить код состояния с веб-сайта через мой прокси. По какой-то причине без изменения какого-либо кода примерно в 8 раз из 10 java-программа генерирует исключение SocketException (java.net.SocketException: Reply from SOCKS server has bad length
), но в других случаях она работает и правильно печатает код ответа HTTP.
Что я пробовал
Если я запускаю прокси-программу на отдельном компьютере или на виртуальной машине, она всегда работает без каких-либо ошибок (по крайней мере, надеюсь, я запустил java-программу ~ 20 раз, и она не вызвала исключение). В моем случае это нереальное решение, потому что прокси должен работать локально, как часть программы, над которой я работаю.
Мой код
Реализация SOCKS в C # слишком длинна для SO-сообщения (~ 100 строк), поэтому я загрузил его в Pastebin .
Ниже приведен мой тестовый код Java.
public static void main(String[] args) throws Exception {
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 32128));
HttpURLConnection conn = (HttpURLConnection)(new URL("http://somedomain.com/")
.openConnection(proxy));
conn.setDoInput(true);
conn.setDoOutput(false);
conn.connect();
System.out.println(conn.getResponseCode());
}
Вопрос
Почему прокси-сервер работает, если я размещаю его на отдельном компьютере / виртуальной машине, но не удается, когда я размещаю (и использую) его локально? И когда это работает локально, что может быть причиной, казалось бы, случайного поведения, и как я могу это исправить?
EDIT:
Я забыл упомянуть, что код в настоящее время функционирует только как прозрачный прокси-сервер, то есть он пока не передает соединения на другие IP-адреса.