Від’ємні числа в SOCKS-адресі Java — не від’ємні IP
Читайте поля SOCKS-адреси як беззнакові значення протоколу, розбираючи їх засобами Java byte API.
У Java byte є знаковим. Тому октет, мережеве значення якого дорівнює 217, може виглядати від’ємним під час прямого виведення з масиву байтів. Це не означає, що проксі надіслав некоректну від’ємну IP-адресу.
Перетворіть збережене значення на беззнакове ціле, наприклад за допомогою Byte.toUnsignedInt(value), або використовуйте DataInputStream.readUnsignedByte() під час читання поля. Для порту в мережевому порядку читайте задокументоване двобайтове значення, а не трактуйте будь-який із байтів як знакове десяткове число.
Відокремлюйте також представлення від кадрування. Читання із сокета може повернути менше байтів, ніж запитано. Прочитайте поле повністю, а потім інтерпретуйте його відповідно до версії SOCKS і типу адреси. Адреси SOCKS5 можуть містити адресу IPv4, адресу IPv6 або доменне ім’я з префіксом довжини; фіксоване припущення про чотири байти охоплює лише одну з цих форм.
Виправлення октету, який виглядає від’ємним, усуває проблему відображення. Але воно не виправляє парсер, що почав читати не з того зсуву або зупинився посередині адреси.