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