En Java, byte tiene signo. Por eso, un octeto cuyo valor en la red es 217 puede aparecer como valor negativo cuando se imprime directamente desde un arreglo de bytes. Eso no significa que el proxy haya enviado una dirección IP negativa no válida.

Convierta el valor almacenado a un entero sin signo, por ejemplo con Byte.toUnsignedInt(value), o use DataInputStream.readUnsignedByte() mientras lee el campo. Para un puerto en orden de red, lea el valor de dos bytes documentado en lugar de tratar cualquiera de los bytes como un número decimal con signo.

Separe también la representación del entramado. Una lectura del socket puede devolver menos bytes de los solicitados. Lea el campo completo y luego interprételo según la versión de SOCKS y el tipo de dirección. Las direcciones SOCKS5 pueden contener una dirección IPv4, una dirección IPv6 o un nombre de dominio con prefijo de longitud; la suposición fija de cuatro bytes solo cubre una de esas formas.

Corregir un octeto que parece negativo resuelve el problema de visualización. No arregla un analizador que empezó a leer en un desplazamiento incorrecto o se detuvo a mitad de la dirección.

Artículos relacionados