В Java byte знаковый. Поэтому октет, сетевое значение которого равно 217, может выглядеть отрицательным при прямом выводе из массива байтов. Это не означает, что прокси отправил некорректный отрицательный IP-адрес.

Преобразуйте сохранённое значение в беззнаковое целое, например с помощью Byte.toUnsignedInt(value), или используйте DataInputStream.readUnsignedByte() при чтении поля. Для порта в сетевом порядке читайте задокументированное двухбайтовое значение, а не трактуйте любой из байтов как знаковое десятичное число.

Отделяйте также представление от кадрирования. Чтение из сокета может вернуть меньше байтов, чем запрошено. Прочитайте поле целиком, затем интерпретируйте его в соответствии с версией SOCKS и типом адреса. Адреса SOCKS5 могут содержать адрес IPv4, адрес IPv6 или доменное имя с префиксом длины; фиксированное предположение о четырёх байтах покрывает только одну из этих форм.

Исправление октета, который выглядит отрицательным, решает проблему отображения. Но оно не исправляет парсер, начавший чтение не с того смещения или остановившийся на середине адреса.

Похожие статьи