In Java ist byte vorzeichenbehaftet. Ein Oktett mit dem Leitungswert 217 kann daher als negativer Wert erscheinen, wenn es direkt aus einem Byte-Array ausgegeben wird. Das bedeutet nicht, dass der Proxy eine ungültige negative IP-Adresse gesendet hat.

Wandeln Sie den gespeicherten Wert in eine vorzeichenlose Ganzzahl um, etwa mit Byte.toUnsignedInt(value), oder verwenden Sie DataInputStream.readUnsignedByte() beim Lesen des Feldes. Bei einem Port in Netzwerkreihenfolge lesen Sie den dokumentierten Zwei-Byte-Wert, statt eines der beiden Bytes als vorzeichenbehaftete Dezimalzahl zu behandeln.

Trennen Sie außerdem Darstellung von Framing. Ein Socket-Lesevorgang kann weniger Bytes zurückgeben als angefordert. Lesen Sie das vollständige Feld und interpretieren Sie es dann gemäß SOCKS-Version und Adresstyp. SOCKS5-Adressen können eine IPv4-Adresse, eine IPv6-Adresse oder einen Domänennamen mit Längenpräfix enthalten; die feste Annahme von vier Bytes deckt nur eine dieser Formen ab.

Ein negativ erscheinendes Oktett zu korrigieren behebt das Anzeigeproblem. Es behebt keinen Parser, der am falschen Offset zu lesen begonnen oder mitten in der Adresse aufgehört hat.

Ähnliche Artikel