En Java, byte est signé. Un octet dont la valeur sur le fil est 217 peut donc apparaître comme une valeur négative lorsqu'il est imprimé directement depuis un tableau d'octets. Cela ne signifie pas que le proxy a envoyé une adresse IP négative invalide.

Convertissez la valeur stockée en entier non signé, par exemple avec Byte.toUnsignedInt(value), ou utilisez DataInputStream.readUnsignedByte() pendant la lecture du champ. Pour un port en ordre réseau, lisez la valeur sur deux octets documentée plutôt que de traiter l'un des octets comme un nombre décimal signé.

Séparez aussi la représentation du cadrage. Une lecture de socket peut renvoyer moins d'octets que demandé. Lisez le champ complet, puis interprétez-le selon la version de SOCKS et le type d'adresse. Les adresses SOCKS5 peuvent contenir une adresse IPv4, une adresse IPv6 ou un nom de domaine préfixé par sa longueur ; l'hypothèse fixe de quatre octets ne couvre qu'une de ces formes.

Corriger un octet qui semble négatif règle le problème d'affichage. Cela ne corrige pas un analyseur qui a commencé à lire au mauvais décalage ou s'est arrêté au milieu de l'adresse.

Articles similaires